ソフトウェア工学

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

3
アプリケーションコードと単体テストのインターフェイス
私は、いくつかの新しいモジュールを実装してユニットテストする必要があるプロジェクトに取り組んでいます。私はかなり明確なアーキテクチャを念頭に置いていたので、メインのクラスとメソッドをすぐに書き留めてから、単体テストの作成を開始しました。 テストを書いている間、次のような元のコードにかなりの修正を加える必要がありました。 それらをテストするためにプライベートメソッドをパブリックにする プライベート変数にアクセスするためのメソッドを追加する ユニットテスト内でコードを実行するときに使用するモックオブジェクトを挿入するためのメソッドを追加します。 どういうわけか私はこれらが私たちが何か間違ったことをしている症状であると感じています、例えば 最初の設計が間違っていた(一部の機能は最初から公開されているはずでした)、 コードは、単体テストとのインターフェース用に適切に設計されていません(おそらく、かなりの数のクラスが既に設計されているときに単体テストの設計を開始したという事実が原因です)。 ユニットテストを間違った方法で実装している(たとえば、ユニットテストはAPIのパブリックメソッドを直接テスト/アドレスするだけであり、プライベートメソッドをアドレスするべきではない)。 上記の3つのポイントの混合、およびおそらく私が考えていなかったいくつかの追加の問題。 単体テストの経験はあるものの、第一人者にはほど遠いので、これらの問題についてのあなたの考えを読んでいただければ非常に興味があります。 上記の一般的な質問に加えて、より具体的で技術的な質問があります。 質問1.クラスAのプライベートメソッドmを直接テストし、それをテストするためにパブリックにすることは理にかなっていますか?または、mを呼び出す他のパブリックメソッドを対象とする単体テストによってmが間接的にテストされると想定する必要がありますか? 質問2.クラスAのインスタンスにクラスB(複合集約)のインスタンスが含まれている場合、AをテストするためにBを模擬することは理にかなっていますか?私の最初のアイデアは、BインスタンスはAインスタンスの一部であるため、Bをモック化しないことですが、それからこれについて疑い始めました。Bをモックすることに対する私の議論は、1と同じです:Bはプライベートwrt Aであり、その実装にのみ使用されます。しかし、これらの問題は設計上の欠陥を示している可能性があります。おそらく、複合集約ではなく、AからBへの単純な関連付けを使用する必要があります。 質問3.上記の例で、Bをモックすることにした場合、どのようにBインスタンスをAに注入しますか?ここに私たちが持っていたいくつかのアイデアがあります: AコンストラクターでBインスタンスを作成する代わりに、Aインスタンスの引数としてBインスタンスを注入します。 BFactoryインターフェースを引数としてAコンストラクターに渡し、Aがファクトリーを使用してプライベートBインスタンスを作成できるようにします。 AにプライベートなBFactoryシングルトンを使用します。シングルトンを設定するには、静的メソッドA :: setBFactory()を使用します。Aが設定されている場合(テストシナリオ)、ファクトリシングルトンを使用するBインスタンスを作成する場合、シングルトンが設定されていない場合(実稼働コードシナリオ)、Bを直接作成します。 最初の2つの代替案は私にはきれいに見えますが、Aコンストラクターのシグニチャーを変更する必要があります。APIを変更してテストしやすくすることは、私には不便に思えますが、これは一般的な方法ですか? 3番目の方法には、コンストラクターのシグニチャーを変更する必要がない(APIへの変更の影響が少ない)利点がありますが、テストを開始する前に静的メソッドsetBFactory()を呼び出す必要があります。これはIMOエラーが発生しやすい(テストが適切に機能するためのメソッド呼び出しへの暗黙の依存関係)。どちらを選べばいいのかわかりません。

4
構造とクラスの起源
プログラマーが最初に構造とクラスを使用することを決定したときに、プログラマーが解決しなければならない設計と実装の問題は何ですか? これはいつ起こり、これらのアイデアの先駆者は誰でしたか? 構造とクラスは関連しているため、これは二重の質問です。構造はクラスよりもかなり古いことに気づきました。答えがそれらの両方について別々に話し、いくつかの出典を引用することは素晴らしいことです。

6
安全のためにカプセル化はどのように使用されますか?
OOPを学習しています。私はカプセル化について多くのことを学びましたが、読むほど、混乱しました。 私は(プライベートにすることで)データを隠し、プロパティまたはメソッドとしてクラスのユーザー(他の開発者)に公開することを理解しています。また、カプセル化によって詳細を隠すことも理解しています。 記事(http://www.csharp-station.com/Tutorial/CSharp/lesson19)で私は読んだ: 記事の要約 オブジェクトを設計するときは、他の人がそれをどのように使用できるかを考える必要があります。最良のシナリオでは、オブジェクトを使用するすべてのプログラムが適切に設計され、コードが変更されることはありません。ただし、実際にはプログラムは頻繁に変更され、チーム環境では多くの人が一度に同じコードに触れます。したがって、オブジェクトがどのように自然のままの画像だけでなく、間違って行くことができるかを検討することは有益である必要があります使用すること。 BankAccountオブジェクトの場合は、オブジェクト外のコードが10進数のAmountフィールドまたは文字列CustomerNameフィールドにアクセスできる状況を調べます。コードが作成された時点で、すべてがうまく機能します。ただし、開発サイクルの後半では、情報間の関係(または内部状態の定義を変更する他の有効な理由)を複製したくないため、BankAccountオブジェクトは文字列CustomerNameではなくint CustomerIDを追跡する必要があることに気付きます。 。このような変更は、元々設計されたとおりに(CustomerNameが文字列である)BankAccountクラスを使用するように構築されているため、コードに波及効果を引き起こし、アプリケーション全体でその状態にアクセスするコードを変更する必要があります。 カプセル化のオブジェクト指向の原則は、このような問題を回避するのに役立ち、メソッド、プロパティ、インデクサーなどの型メンバーを介して内部状態を非表示にし、アクセスを抽象化できます。カプセル化は、オブジェクト間の結合を減らし、コードの保守性を向上させるのに役立ちます。 質問 カプセル化は、コードに変更を加えるとき、およびその波及効果からどのように役立ちますか。データメンバーの場合、その型をintからfloatに変更すると(プロパティを使用してこれを公開している場合でも)、このコードを既に使用している変数の型を変更する必要があります。 カプセル化がこのような変更にどのように役立つかを教えてください。 このヘルプとガイダンスをありがとう。

3
.NET依存関係管理システム
依存関係管理ソリューションを検討するに値するほど大きくなり始めている.NETプロジェクトがいくつかあるので、あるプロジェクトから別のプロジェクトにバイナリをコピーする必要はありません。これが私がこれまでに見つけたものです: NPandayはMavenのポートに基づいています。最近どのように取り組んだかはわかりませんが、最後のリリースは2011年5月でした。 NuGetは活発に開発中であるようで、Microsoftから直接サポートされているようです。「依存関係の解決にのみ対処する」と不満を言う人もいますが、それ以外に何を対処すべきか、またはそれ以降に機能が追加されたかどうかはわかりません。最近、ビルドプロセスの一部としてバイナリをインポートする機能が追加されたようです。そのため、リポジトリにコミットする必要はありません。 2011年9月以降、何の注意も払われていないため、Refixはまだベータ版のようです。 これらの依存関係管理ツール(またはうまく機能する他のツール)を使用した最近の経験を持つ誰かがあなたの経験を共有しますか?NuGetは依存関係管理にそれを使用するのに十分成熟していますか?そうでない場合、何が不足していますか?

6
情報のソースとしてユニットテストを使用する方法
私の同僚は、アジャイル開発に関するセミナーにかつて、ユニットテストを技術文書として使用することが可能だと聞いていました。クラスの使用方法の例として単体テストを使用するようなもの。 Googleのクイック検索でTDDとドキュメントが提供されました。これにより、それが可能であることが証明されます。しかし、コードを見ると、明らかにそのような方法で単体テストを実装できていないことがわかります。 私の意見では、ユニットテストは、モックおよび偽のクラスと関数の助けがあっても、最小限のユニットとしてコードをテストするためにあります。 したがって、質問は次のとおりです。 クラス(またはクラスのセット)の使用方法を示すのは、機能テストのタスクではありませんか? 単体テストを技術文書として使用できる場合、そのような単体テストの実装方法に関するガイドラインはありますか?

6
IEで別のJavaScriptを実行することは悪い習慣と考えられていますか
IEで別のJavaScriptを実行することは悪い習慣(そしてどれほど悪いこと)と考えられていますか?現在、JavaScriptを書いていて、IEの癖を回避する簡単な方法は、ブラウザーのバージョンを確認して別のコードを実行することです var browserName = navigator.appName; if (browserName == "Microsoft Internet Explorer") { //Do some stuff } else { //Do other stuff } 高速でうまく機能しますが、コードの重複につながり、「ハック」と感じます。

3
Ajax競合状態
Ajaxの競合状態を処理するためのパターンまたは標準的な方法はありますか?次の例を見てください。2つのテーブルがあります。テーブル1の行をクリックすると、DBからデータが削除され、テーブル2が更新されます(テーブル1のすべての行から、クリックされた行を差し引いたものが表示されます)。 誰かが一連の行を連続してクリックする場所がある場合、タイミング/ラグの問題に対するすべてのクリックでテーブル2が更新されないシナリオが発生する可能性があります。 これに取り組む良い方法は何でしょうか?私は可能なキューを使用することを考えていましたが、それは非同期で実行する目的を無効にします。ただし、UIがロックされないという利点はあります。

5
日付と時刻の2つのデータベースフィールド-マージする必要がありますか?
次の質問では、フィールドとテーブルの名前がIDを保護するために変更されています。 2つのデータベース列がある場合: MONKEY_DATE DATETIME NULL (with data e.g. 2012-05-14 00:00:00.000) MONKEY_TIME DATETIME NULL (with data e.g. 1753-01-01 16:30:53.025) 時間フィールドの日付コンポーネントは、ほとんどが1753年1月1日に設定されています...しかし、一部のデータは1899年1月1日で、一部は1900年1月1日です。 これらの列をクエリおよびレポートするコードを維持すると、私(および私たちのチーム)は2つの列をマージすることで簡単に解決できる頭痛の種を引き起こします。しかし、経験(およびTerry Goodkind)は、決して簡単なことはないことを教えてくれました。これが頭痛の原因であるいくつかの例を以下に示します。 私のアプローチ 次のアプローチには、2つの列をマージするという望ましい効果があると思います。 SQLを使用してデータを更新し、日付フィールドの値と時間フィールドの値の両方を同じ値に設定します。これは、日付フィールドの日付コンポーネントと時間フィールドの時間コンポーネントの混合です。 MONKEY_DATEフィールドのみを使用して新しいコードを記述します 最終的にMONKEY_TIMEフィールドと日付/時刻コンポーネントSQLを段階的に廃止します(例を参照) MONKEY_TIMEをドロップ これは、すぐに行ってシステム全体に遡及的な変更を加える必要がないことを意味します。既存のコードはすべて引き続き機能します...そして、正しい方法で作業を開始できます。 #1のSQLは(Oracle)の場合があります。 UPDATE MONKEY SET MONKEY_DATE = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') || TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), 'MM/DD/YYYY HH24:MI:SS') MONKEY_TIME = TO_DATE(TO_CHAR(MONKEY_DATE, 'MM/DD/YYYY ') || TO_CHAR(MONKEY_TIME, 'HH24:MI:SS'), …

4
Javaを使用したCSVファイルの生成
プロジェクトでは、Javaプログラムを使用して2時間ごとに大きなCSVファイルを生成する必要があります。 このファイルには約60,000行(1行あたり約120文字)があります。サイズはまだわかりません。 FileWriterを使用してファイルを開き、書き込みを続け、最後にファイルを閉じるため、メモリの問題が発生するかどうかを知りたいです。 ファイルのサイズを気にする必要がありますか?はいの場合、FileWriterを使用する以外に、Javaで大きなファイルに書き込むための優れたテクニックはありますか? Java 5を使用しています。
8 java  csv 

6
他人のコードを変更するコストの見積もり[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 私はウェブ開発に比較的慣れていないため、まだ多くの大規模プロジェクトの見積もりを出す必要はありませんでした(私の最後の大規模プロジェクトは、厳密な期限や予算なしで1時間単位で支払われました)。 クライアントから、Webサイト(php / mysqlバックエンド)の別の開発者コードに無数の変更を提供するためのコストと時間の見積もりを提供するように求められています。 これを分析して推定する方法について誰かがアドバイスやリンクを提供できますか?コードは恐ろしいもので(ウェブサイトは何年も前に元々はインドにアウトソーシングされていました)、突然ハードルにぶつかり、私の見積もりを水から吹き飛ばしてしまうかどうかはわかりません。

4
Objective-Cはどこから来たのですか?C ++またはC?
このプログラミング言語であるObjective-Cは、iOSアプリケーションの開発に使用されていると聞いています。 OOPの原則を使用していることは知っています。すでにC ++を知っていると、より簡単に学習できますか?名前は?Cプログラミング言語とC ++で使用するOOP原則の組み合わせですか?
8 c++  c  ios  objective-c 

7
プログラマーのトレーニングに対してクライアントに請求する料金の選択[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 4年前休業。 私たちは少し難しい状況に置かれており、私はそれに対処するための最良の方法とそれを請求する方法を理解しようとしています。 私たちは顧客向けのカスタムWebアプリを作成しました。私はこのアプリを過去1.5年間維持しています。彼らは数週間前に、開発者を雇い、プロジェクトを社内に持ち帰りたいと言ってメールを送った。(以前は家に持ち帰ることについては何も触れられていませんでした。)もちろん、1年以上プロジェクトに取り組むことを期待していたので驚きました。 私は1週間前に開発者と面会し、サイトの基本を確認しました。私の提案(別のレートの提案を含む)とフォローアップメールの後に、現在使用されているライブラリ/テクニックを使用してアプリの開発を継続する方法についてトレーニングをするかどうか尋ねられました。(開発者は言語に精通していますが、ライブラリには精通していません。) サイトとライブラリ(再利用可能なライブラリ)に合わせて特別に調整された1対1のトレーニングにどれくらいの費用がかかるのでしょうか。トレーニングは、開発者のスキルレベルに応じて、3〜6時間になると思います。 レートを考え出す際の私の難しさは次のとおりです。 クライアントとプロジェクトをこれ以上持たないようにすることで、数万ドルを失うことになります(将来の機会は言うまでもありません)。ですから、この収入の一部を訓練で置き換えたいと思います。 私は基本的に誰かが私たちがやることを行うように訓練し、彼らに私たちと競争する機会を与えています。彼らは私たちの会社と直接競争する可能性があるかなり大きな会社ですが、私たちの2社が直接競争することはまずありません。 私たちは何年もかけてライブラリー(50%外部と50%私たちのもの)とそれらの背後にあるテクノロジー(直接の支払いはありません)を学びました。 特に1対1のトレーニングの場合、トレーニングの継続率がどの程度かはわかりません。 他のビジネス関係に影響を与える可能性が少しあるので、正しいことをしたいです。 私が最初に考えたのは、現在充電しているレートの約5倍を充電することでしたが、これは高いと感じているようです。 (私たちはトレーニングを行うために契約を結ぶことをそれほど心配していませんが、それは私たちも学ぶことができるユニークな機会です。) あなたの提案やアイデアをありがとう。これは少し主観的な質問であることは知っていますが、私は考えていない提案や何かを探しています。

8
Web開発者はスライスの方法を知っている必要がありますか?
私はウェブ開発者です。私はあらゆる種類のWebサイトとWebアプリケーションを行っています。 多くのお客様がWeb開発者とスライサーの違いを知らないのは私にとって非常に奇妙です。彼らは単に「PSDを与える」ことを望んでおり、DBバックエンドなどを備えたWebサイトを提供することを期待しています... 私はここでただ質問しているだけです。私は自分の考えに誤りがありますか? もちろん、Web開発者はhtmlとcssを知っている必要がありますが、PSDをスライスしてcssグルが実行できるすべての作業を実行する必要があるとは思いません... これについてご意見をお聞かせください。

2
プログラミング言語、位置言語、自然言語
アセンブリ言語のように、一部のプログラミング言語はマシンコードをモデルにしています。他の言語は自然言語である英語をモデルにしています。その他は、マシンコードまたは自然言語のどちらにもモデル化されていません。たとえば、PROLOGなどの言語はどちらのモデルにも従いません。 私はこのPerlモジュールLingua :: Romana :: Perligataに出くわしました。これにより、ラテン語によく似た構文を使用してプログラムを記述できます。 位置構文が少ないプログラミング言語はありますか? フランス語、ヘブライ語、ペルシア語など、他の自然言語に触発された構文で記述できる他の言語またはモジュールはありますか?ウィキペディアには非常に長いリストがありますが、それらのプロジェクトのほとんどは死んでいます。 StackOverflowに関連する質問があります。受け入れられた答えは「グーグルを使う」です。

2
AndroidでのAndroidの開発
現在、AndroidフォンでAndroidアプリを開発する方法はありますか?言い換えれば、PCを使用せずに電話で通常のAndroid Javaを記述、コンパイル、インストール、実行しますか?そうでない場合、可能であれば何が可能になるでしょうか?(ルート化が必要でしょうか?またはAndroid用にコンパイルされたAndroidエミュレーター?)
8 android 

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