ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

3
既知の問題をソフトウェアに直接入れることは適切ですか?
Androidアプリのメンテナンスを引き継ぎました。多少の問題は残っていますが、多少の修正はありますが、Android OSのバージョンが異なるためにまだ問題があります。 たとえば、MediaPlayerクラスを使用してWebリクエストを送信すると、リクエストが送信される前にOSによってカスタムHTTPヘッダーが取り除かれますが、Android 4.X(徹底的にテスト済み)のみであり、この特定の機能は依存するため失敗しますそれらのヘッダー。 これは既知の問題であり、回避しようとしていますが、次のような条件付きチェックを行うことをお勧めします if (OS.VERSION == 4) { knownIssueDialog(This feature will not work on your Android version... etc."); } 明らかに、サポートチャネルにこれを記載しますが、これらの既知の問題もソフトウェアに埋め込み、必要なときに必要に応じて提示することは(すべてを追跡することを前提とする)良いアイデアかどうか疑問に思っています。上記のようなものです。 このような種類の問題に基づいて、複数の悪いレビューと多くのサポートメールを受け取り続けるため、適切に機能しないことがわかっている機能をブロックするだけで、多くの時間と頭痛の種を節約できると思います。 2つの潜在的な問題があります。 ユーザーは、「既知の問題」ダイアログのようなものを見たことがないでしょう。多くのユーザーは、それが何を意味するのか理解していないかもしれません。 開発のオーバーヘッドが少しあります-これらの問題をコードのどこかに追跡する必要があります。幸いなことに、Javaアノテーションを使用すると、そのような条件付きチェックの前に、@KnownIssueまたはそれに類することができるため、それらの検索/変更が非常に簡単になります。 ソフトウェアに「既知の問題」プロンプトを入れるのは理にかなっていますか? 編集:これは、約1週間前に発生し始めた問題であることを追加します。私は問題を半分修正しましたが、問題を引き起こしているのはOSであるため、4.Xで修正できる可能性は非常に低いです。修正された新しいバージョンをリリースして、ユーザーベースの50%を再び幸せにし、他の50%(4.Xユーザー)に4.Xでも問題が続くことを警告し、アップグレード(または何か)。問題は、ソフトウェアでそれを行う(つまり、4.Xユーザーにダイアログを表示する)か、「修正が機能しませんでした!!!」というサポートメールを送信するだけかどうかです。その後、問題をさらに詳しく説明するサポートページに移動します。

1
Open Data Protocol(odata)は開発コミュニティに広く受け入れられていますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 編集:あなたがodataに精通していない場合、ここに行きます。 この技術を学ぶ価値があるのか​​、それが理解できないものなのかを判断しようとしています。 前提は興味深いものであり、APIの開発者としては、APIを使用する開発者により多くの柔軟性を提供する良い方法のようです。 残念ながら、過去数年間、Open Data Protocolに関する「バズ」はあまり見られないので、一度習得したら、その可能性があるかどうかを測定しようとしています。 前もって感謝します。

2
Smalltalkの「become:」の用途は何ですか?
become:Smalltalk のメッセージは、1つのオブジェクトを別のオブジェクトに変更し、そのオブジェクトへのすべての参照に影響を与えます。 この言語機能にはどのような用途がありますか?実際のコードで使用されますか?それは単なる好奇心ですか?それを使用するのは良い/悪い習慣と見なされますか?

2
C ++ 11でauto_ptrの廃止の設計変更を処理する方法は?
C ++ 11(つまり-std=c++11)でライブラリをテストしています。ライブラリはauto_ptr次のパターンを使用します: Foo* GetFoo() { autoptr<Foo> ptr(new Foo); // Initialize Foo ptr->Initialize(...); // Now configure remaining attributes ptr->SomeSetting(...); return ptr.release(); } C ++ 11は非推奨auto_ptrになったため、それから離れたいと思います。 ただし、コードはC ++ 03とC ++ 11の両方をサポートしているため、ヤンクするほど単純ではありませんauto_ptr。また、ライブラリに外部依存関係がないことにも言及する価値があります。C ++ 03を使用します。Autotools、Cmake、Boostなどを使用しません... auto_ptrC ++ 03との互換性を維持しながら、C ++ 11 から移行するための設計変更をどのように処理する必要がありますか?
12 design  c++  c++11 

3
「メソッドは値を返すか副作用があるはずですが、両方ではありません」の起源
私は一度、メソッドには戻り値があり(参照的に透過的)、または副作用がありますが、両方ではないことを読みました。このルールへの参照は見つかりませんが、それについてもっと学びたいです。 このアドバイスの起源は何ですか?どの人またはコミュニティからそれが生じましたか? 追加クレジット:このアドバイスに従うことの利点は何ですか?

3
他のインターフェイスから継承する場合、インターフェイスは「空」と見なされますか?
空のインターフェースは、私が知る限り、一般的に悪い習慣と見なされます-特に属性のようなものが言語によってサポートされている場合。 ただし、他のインターフェイスから継承する場合、そのインターフェイスは「空」と見なされますか? interface I1 { ... } interface I2 { ... } //unrelated to I1 interface I3 : I1, I2 { // empty body } 実装があることは何もI3実装する必要がありますI1とI2、および継承があること、異なるクラスのオブジェクトI3、その後(下記参照)を交換可能に使用することができるが、それは右呼び出すことですI3 空の?もしそうなら、これをアーキテクチャ化するより良い方法は何でしょうか? // with I3 interface class A : I3 { ... } class B : I3 { ... } class Test { void foo() …

1
複数のプロジェクトを含むCMake(C ++)リポジトリのディレクトリ構成
単一の(git)リポジトリに保存されている一連の関連する独立したC ++プロジェクトの編成に関するアドバイスをお願いします。プロジェクトはCMakeを使用します。 簡単な例として、2つのプロジェクトAとB、Bに依存するAを想定します。Aを開発するほとんどの人は、パッケージングシステムを介してBを取得します。したがって、Aのみをコンパイルします。ただし、開発者がAとBの両方を個別にコンパイル(およびインストール)できるようにする必要があります。 これが提案です: └── Repo1 ├── CMakeLists.txt (1) ├── A │ ├── CMakeLists.txt (2) │ ├── include │ │ ├── aaa.h │ │ ├── aaaa.h │ │ └── CMakeLists.txt (3) │ └── src │ ├── aaa.cpp │ ├── aaaa.cpp │ └── CMakeLists.txt (4) ├── B │ ├── CMakeLists.txt (2) …

2
JavaコレクションフレームワークインターフェイスのUnsupportedOperationException
Java Collections Frameworkを調べてみると、かなりの数のインターフェースにコメントがあることがわかりました(optional operation)。これらのメソッドを使用すると、クラスUnsupportedOperationExceptionを実装したくない場合にクラスを実装できます。 この例は、のaddAllメソッドSet Interfaceです。 さて、この一連の質問で述べられているように、インターフェースは、使用が期待できるものを定義する契約です。 インターフェースは、クラスが行うこととそれを行う方法を分離するため、重要です。クライアントが期待できるものを定義する契約により、開発者は契約を維持する限り、自由に実装できます。 そして インターフェースとは、オブジェクトが実行できるアクションの説明です。たとえば、ライトスイッチをオンにしたとき、ライトが点灯したとき、どのように気にせず、それを行うだけです。オブジェクト指向プログラミングでは、インターフェイスとは、オブジェクトが「X」になるために必要なすべての機能の説明です。 そして インターフェースベースのアプローチはかなり優れていると思います。その後、依存関係をうまくモックアウトできますが、基本的にはすべてがあまり密結合ではありません。 インターフェースのポイントは何ですか? インターフェイスとは何ですか? インターフェイス+拡張(mixin)vs基本クラス インターフェースの目的はコントラクトを定義し、依存関係を疎結合にすることであるため、一部のメソッドでUnsupportedOperationException目的を達成できない場合がありますか?それは私がもう渡されSetずに使うことができないことを意味しますaddAll。むしろ、どの実装Setが渡されたかを知る必要があるためaddAll、使用できるかどうかを知ることができます。それは私にはかなり価値がないようです。 それで、何のポイントUnsupportedOperationExceptionですか?従来のコードを補うだけで、インターフェースをクリーンアップする必要がありますか?それとも、私が見逃しているより感覚的な目的がありますか?

3
バイナリツリーは、階層データを格納する特定の目的に役立ちますか?それらの標準的な使用は何ですか?
バイナリツリーの構造と、それらのトラバース方法を理解しています。しかし、私はそれらの実際の使用法、プログラムとプログラミングの目的を実現するのに苦労しています。階層データの「実際の」例について考えると、ほぼ確実に2つ以上の子があります。たとえば、家系図では、母親には2人以上の子供がいることがよくあります。 「バイナリツリー」は、配列とリストの処理時間が高速であるため、線形関連データの保存にのみ有効ですか?または、階層データを保存する特定の目的に役立ちますか?もしそうなら、二分木の適用の例は何ですか。ノードに最大 2つの子があるようなデータは何ですか?

2
Javaコレクション(java.util)のパッケージ構造-Iterableがjava.langにあるのはなぜですか?
以下の図のように、interfaceを除いてIterable、残りのすべての構成要素(interface / class / abstract class)は同じパッケージにありますjava.util パッケージにIterable座っているのはなぜjava.langですか? 注:意図は、Javaプログラミングのパッケージングの側面を理解することです。


3
ビルド自動化対デプロイ自動化対継続的統合
もっと効率的になりたいし、opsツールを効率的に使いたい。 これを念頭に置いて、私は継続的インテグレーションについてもっと学びたかったのですが、それに関して多くの異なることがあるようです。 私は実際に私の仕事(IntelliJ、WebStorm ...)でJetbrainsスーツを使っているので、それらを使い続けたいと思っていました。 私の問題は、以下の違いがわからないことです。 ビルディングオートメーション(TeamCityはこの種のソフトウェアです):リモートVCSリポジトリを使用してアプリケーションをビルドできることは知っていますが、それは素晴らしいことですが、その主な目的は何ですか?これを行う際にどのような情報が重要ですか?実際、ソフトウェアがローカルでビルドされているかどうか、チームメートも既に知っています。それでは、自動化を展開せずにそれを使用する目的は何ですか? 自動化の展開(TeamCityは簡単に実行できないようです) 継続的インテグレーション(上記の2つの組み合わせのようです) 継続的デリバリ(これは正確に何ですか?なぜ継続的インテグレーションと異なるのですか?) これをもう少し理解してもらえますか?

2
データベースの変更(挿入、更新、削除)が発生したときに、リアルタイムの通知を取得する方法は?
データベーステーブルを監視するダッシュボードを作成しています。データベースアクセスのみがあります(アプリケーション層はありません)。テーブルはかなり大きい(1000万行)が、急速には変化しない(1分間に100回の挿入/更新) テーブルが変更されたかどうかを確認するにはどうすればよいですか?私は毎秒データベースにアクセスしようとしますが、これは総当たり的なアプローチのようです... データベース:MySQL / Postgres

3
ユニットテストコンテスト
私の雇用主は、毎月の単体テストの日の競争を実施しています。1日は単体テストの作成に専念します。明らかに、1か月を通してより多くのテストを行いますが、これは1日であり、コンテストの「勝者」には賞が与えられます。しかし、勝者が誰であるかを判断するのは難しいと感じています。 各テストケースにポイントを割り当てていました。したがって、このような単体テストを作成した場合... for (int i = 0; i < 100; i++) { assertTrue(i*i, square(i)); } 100ポイントが与えられます。明らかにこれは単純な例ですが、各テストケースに「ポイント」を割り当てる際の問題を示しています。 私たちは主にJavaとJavascriptのショップです。そのため、テストしたコードブランチの数をメトリックとしてカウントすることをお勧めします。コードカバレッジツール(EclEmmaなど)を使用して、テストしたブランチを簡単にカウントできます。ただし、Seleniumテストでこれをどのように行い、Javascriptソースのコードカバレッジを取得するのかわかりません(アイデアはありますか?) このコンペティションの勝者をどのように決定できるかについての提案はありますか? 編集 私は単体テストの書き方を知っています。効果的な単体テストの書き方を知っています。何をテストするか決めるのに助けは必要ありません。私はこの競争をコントロールすることはできません。競争は続きます。それで、私はそれを改善するためにいくつかの入力を追加するか、テストをゲームで続けます(はい、私はそれらをゲームします。もちろんそれらをゲームします。賞品があります) 編集 この質問ここでは、明らかに重複していない、それは良いテストケースを見つける方法に関する有用な情報が含まれているものの、それが競争を評価するための任意の有用な指標を提供していません。

2
ETLおよびレポートプロジェクトにTDDメソッドを使用してユニットテストを行うにはどうすればよいですか?
ETLプロジェクトは、SSIS、PowerCenterなどのETL(抽出-変換-ロード)ツールを使用して作成されたプロジェクトです。 これらには通常、外部ソースからのデータの読み取り、ステージングデータベースへのデータの読み込み、特定の変換の実行、最終データベースへの読み込みが含まれます。 簡単な例は、SSISを使用して、SSISを使用して学校の先生が提供するExcelファイルを読み取り、データベースにロードすることです。次に、ストアドプロシージャまたは複数のSSISパッケージを作成して各生徒の成績を計算し、そのデータをデータマート\ウェアハウスにロードします 次に、マートの上にストアドプロシージャを構築して、レポートツール(SSRS \ Excel \ etc)が視覚化を生成するために使用する出力を生成します。 このシナリオでTDDと適切な単体テストを実行する方法を理解しようとしています。ETLのテストは、主にステージングテーブルにロードされたデータがソースからのデータの正しいサブセットであることを確認することに関するものです。そのため、テストを実装すると、ETLのミニバージョンが実装されます。レポートSPの出力はテーブル自体のデータに依存するため、スクラブされたテストデータを含むデータベースを作成したとしても、メンテナンスの悪夢がなければ安定した出力データのセットを持つことはできません。 例: スプリント1:学生テーブルには名前、年齢、成績が含まれます このテーブルのテストデータを作成し、それに基づいて単体テストを作成します スプリント2:性別フィールドがテーブルに追加されます。 学生フィールドのデータを更新して性別属性を設定すると、データが変更されたため、テストケースは無効になります。しなければ、性別の列を必要とするテストケースを作成できません
12 unit-testing  sql  tdd 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.