タグ付けされた質問 「design」

ソフトウェア設計による問題の解決とソリューションの計画に関する質問。

6
オブジェクト指向のプラクティスを広める方法に関するヒント[非公開]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新することがありますので、上のトピックソフトウェア工学スタックExchange用。 4年前に閉鎖されました。 私は約250人の開発者がいる中規模の会社で働いています。残念ながら、それらの多くは手続き型の考え方に固執しており、実際にはアプリケーションに豊富なロジックが含まれている場合でも、一部のチームは大きなトランザクションスクリプトアプリケーションを常に提供しています。また、設計の依存関係を管理できず、最終的に別の多数のサービスに依存するサービスになります(クリーンな例 Big Ball of Mudの)。 私の質問は、この種の知識を広める方法を提案できますか? 問題の表面は、これらのアプリケーションのアーキテクチャと設計が貧弱であることです。別の問題は、あらゆる種類のテストの作成に反対する開発者がいることです。 これを変更するために私がやっていること(しかし、私は失敗しているか、変更が小さすぎます) 設計原則(SOLID、クリーンコードなど)に関するプレゼンテーションの実行。 TDDおよびBDDに関するワークショップ。 コーチングチーム(これには、ソナー、findbugs、jdependおよびその他のツールの使用が含まれます)。 IDEとリファクタリングの話。 私が将来することを考えているいくつかのこと(しかし、それらは良くないかもしれないと心配です) オブジェクト指向のエバンジェリストのチームを編成し、オブジェクト指向の考え方を異なるチームに広めます(これらの人々は、数か月ごとにチームを変更する必要があります)。 設計を批判し、改善を提案するために、設計レビューセッションを実行します(時間の制約のために改善が行われない場合でも、これは役立つと思います) 。 私がコーチするチームで見つけたのは、チームを離れるとすぐに、古いチームに戻るということです。私は彼らと一緒に多くの時間を費やさないことを知っています。通常は1ヶ月です。だから私がやっていることは何でも、それは固執しません。 この質問にフラストレーションがたまっているのは残念ですが、これを書く別の方法は、気が散るまで壁に頭をぶつけることでした。

3
複合パターンを使用するか、ツリー構造を使用するか、3番目の実装を使用するかをどのように判断できますか?
「オブザーバー」タイプと「サブジェクト」タイプの2つのクライアントタイプがあります。それらは両方ともグループの階層に関連付けられています。 オブザーバーは、異なる階層全体で関連付けられているグループから(カレンダー)データを受信します。このデータは、データを収集しようとしているグループの「親」グループからのデータを組み合わせて計算されます(各グループは1つの親のみを持つことができます)。 サブジェクトは、関連付けられているグループにデータ(オブザーバーが受信するデータ)を作成できます。グループでデータが作成されると、グループのすべての「子供」もデータを持ち、データの特定の領域の独自のバージョンを作成できますが、作成された元のデータにリンクされます(私の特定の実装では、元のデータには期間と見出しが含まれますが、サブグループは、それぞれのグループに直接リンクされた受信者の残りのデータを指定します)。 ただし、サブジェクトがデータを作成するとき、影響を受けるすべてのオブザーバーがこれと競合するデータを持っているかどうかを確認する必要があります。つまり、理解できる限り、巨大な再帰関数を意味します。 したがって、これは、上下に移動できる階層を持たせる必要があるという事実に要約できると思いますし、いくつかの場所はそれらを全体として扱うことができます(基本的に再帰)。 また、私は単に機能するソリューションを目指しているわけではありません。比較的理解しやすく(少なくともアーキテクチャ的には)、将来的に追加機能を簡単に受信できる柔軟性を備えたソリューションを見つけたいと思っています。 この問題または同様の階層の問題を解決するための設計パターン、または実行すべき優れたプラクティスはありますか? 編集: 私が持っているデザインは次のとおりです。 「Phoenix」クラスは、適切な名前をまだ考えていなかったため、そのように命名されています。 しかし、これに加えて、グループを通じて特定のオブザーバーに関連付けられている場合でも、特定のオブザーバーに対して特定のアクティビティを非表示にする必要があります。 少しオフトピック: 個人的には、この問題をより小さな問題に切り詰めることができるはずだと感じていますが、それは私をどのように回避します。相互に関連付けられていない複数の再帰機能と、さまざまな方法で情報を取得する必要があるさまざまなクライアントタイプが関係しているためだと思います。本当に頭を包むことはできません。階層の問題をカプセル化する方法を改善する方向に誰かが私を導くことができれば、それを受け取ることも非常にうれしいです。

9
大規模な密結合クラスを分割する方法は?
私は、2k行を超えるコード(および成長中)の巨大なクラスをいくつか持っており、可能であればリファクタリングして、より軽くてクリーンなデザインにしたいと考えています。 それが非常に大きい理由は、主にこれらのクラスがほとんどのメソッドがアクセスする必要があるマップのセットを処理し、メソッドが互いに非常に接続されているためです。 非常に具体的な例を挙げServerます。着信メッセージを処理するというクラスがあります。それはのようなメソッドを持っているjoinChatroom、searchUsers、sendPrivateMessage、これらの方法のなどすべてがマップする操作などusers、chatrooms、servers、... チャットルームに関するメッセージを処理するクラス、ユーザーに関するすべてを処理するクラスなどがあればいいかもしれませんが、ここでの主な問題は、ほとんどのメソッドですべてのマップを使用する必要があることです。これらがすべてServerこれらの共通マップに依存しており、メソッドが互いに非常に関連しているため、今のところそれらはすべてクラスに固執している理由です。 クラスChatroomsを作成する必要がありますが、他の各オブジェクトへの参照があります。クラスは、他のすべてのオブジェクトへの参照などを使用して再びユーザーになります。 私は何か間違ったことをしているような気がします。

4
オーバーロードされたメソッドの名前を変更する必要がありますか?
これらのメソッドを含むインターフェースを想定します: Car find(long id); List<Car> find(String model); このように名前を変更する方が良いですか? Car findById(long id); List findByModel(String model); 実際、このAPIを使用する開発者は、初期find()メソッドの可能な引数を知るためにインターフェイスを調べる必要はありません。 だから私の質問はより一般的です:コードでオーバーロードされたメソッドを使用することの利点は何ですか?

4
プログラミング規則よりも一貫性を優先すべきですか?
クラスを設計するとき、動作の一貫性は一般的なプログラミングの実践よりも優先されるべきですか?特定の例を挙げます: 一般的な規則は次のとおりです。クラスがオブジェクトを所有している場合(たとえば、オブジェクトを作成した場合)、それが完了したら、それをクリーンアップする責任があります。具体的な例は、.NETで、クラスがIDisposableオブジェクトを所有している場合、そのオブジェクトが寿命の終わりに破棄されるようにすることです。そして、もしあなたがそれを所有していないなら、触らないでください。 StreamWriter.NET のクラスを見ると、ドキュメンテーションで、基になるストリームが閉じられている/破棄されているときに閉じていることがわかります。これはStreamWriter、ライターが基礎となるファイルストリームを作成し、それを閉じる必要があるときにファイル名を渡すことによってインスタンス化される場合に必要です。ただし、ライターが閉じる外部ストリームを渡すこともできます。 これにより私は何度も悩まされました(閉じないラッパーを作成できることはわかっていますが、それはポイントではありません)が、Microsoftは、ストリームがどこから来たとしても常にストリームを閉じる方が一貫しているという決定を下したようです。 クラスの1つでこのようなパターンに出くわすと、通常、コンストラクターを介して注入さownsFooBarれた場合はfalseに設定され、FooBarそれ以外の場合はtrueに設定されるフラグを作成します。このようにして、呼び出し元がインスタンスを明示的に渡すときに、それをクリーンアップする責任が呼び出し元に渡されます。 今、私はおそらくベストプラクティスよりも一貫性を優先すべきかどうか疑問に思っています(または私のベストプラクティスはそれほど良くないかもしれません)?それに対する/反対の議論はありますか? 明確化のために編集 「一貫性」とは、つまり、オブジェクトを作成または明示的に所有権を譲渡した場合にのみオブジェクトの所有権を取得する「ベストプラクティス」に対して、常に所有権を取得する(およびストリームを閉じる)クラスの一貫した動作です。 厄介な例: いくつかのデータを作成および処理するなど、ストリームを受け入れて何らかの処理を行う2つのクラス(サードパーティライブラリから)があるとします。 public class DataProcessor { public Result ProcessData(Stream input) { using (var reader = new StreamReader(input)) { ... } } } public class DataSource { public void GetData(Stream output) { using (var writer = new StreamWriter(output)) { .... } } …
14 design  .net 

8
どのような状況でも、フローチャートは依然として価値のある便利なツールですか?
最初にプログラミングを始めたとき、私はフローチャート(およびプリンター間隔チャート)に大きく依存していました。COBOLクラスにいる間、フローチャートがインストラクターによってサインオフされるまで、コードを書き始めることができませんでした。当時、私はすべてのフローチャートを作成する必要がありました。 25年後の今日、私は2種類のことだけをフローチャート化しています。ロジックがトリッキーまたは非常に一般的な概念であるすべての大きなステップを適切な順序で定義できるようにするための非常に具体的なアルゴリズム。 私が単に見落としているフローチャートの他のユースケースはありますか?

10
恐ろしいデザインを提示された場合、何をすべきですか?
当社はウェブサイトを作成しています。ウェブサイトもデザインしています。しかし、時々私たちのクライアントは彼/彼女自身のデザインをもたらします。これは多くの場合、社内のデザイナーが作成したものです。または、他の何かに使用したのと同じデザインです。ただし、これらのデザインがひどく見える場合があります。そして、私は本当に非専門的で、アンバランスで、クールではありません。しかし、クライアントは本当にこの設計を望んでいます。私は本当にひどいデザインで作業するのは好きではありません。それはコーディングのすべての喜びを奪います。あなたがコーディングします。デモを確認します。よく働く。ひどいですね。面白くない。 そして最終的にはクライアントは満足するかもしれませんが、1)最終製品に誇りを感じず、2)あなたのイメージに悪いisいウェブサイトを「開発」しているとコミュニティは見ています。 この種のものを経験している人はいますか?おすすめは何ですか? 思っている: これらのクライアントをブロックします。誰かが「独自の」デザインを持っている場合は、最初にそれを確認してください。それからどういうわけか丁寧に断ります。欠点:クライアントを失う。 新しいデザインを作成します。社内のデザイナーに、とてもクールな仕事をしてもらいます。欠点:クライアントはこれを支払う必要があります(要求しないで)、または拒否され、会社は時間=お金を失います。そして、もしあなたが突然新しいデザインを提案するならば、それはin辱として来るかもしれません。彼らのデザイナーは確かにそれを好きではないでしょう。 サイトの下部に明確な免責事項を記入してください。ウェブサイトのデザインはXXXXX、ウェブサイトの開発は米国です。コミュニティへの影響(人々が注意を払う場合)には役立ちますが、不安感には役立ちません。
14 design 

3
WinformsソリューションのMVPを設定するにはどうすればよいですか?
私は過去にMVPとMVCを使用しましたが、MVPのほうが実行の流れを非常によく制御できるので、私の意見ではMVPを好んでいます。 インフラストラクチャ(データストア/リポジトリクラス)を作成し、サンプルデータをハードコーディングするときに問題なく使用できるので、GUIに移行してMVPを準備しています。 セクションA エントリポイントとしてビューを使用するMVPを見ました。つまり、ビューコンストラクターメソッドでプレゼンターを作成し、次にプレゼンターがモデルを作成し、必要に応じてイベントを関連付けます。 プレゼンターは、ビュー、モデル、プレゼンターが作成されるエントリポイントとしても見てきました。このプレゼンターには、コンストラクターでビューとモデルオブジェクトが与えられ、イベントを結び付けます。 2と同じですが、モデルはプレゼンターに渡されません。代わりに、モデルはメソッドが呼び出され、応答が直接返される静的クラスです。 セクションB 私が見たビューとモデルの同期を保つという点で。 ビューの値が変更されたとき、つまりTextChanged.Net / C#のイベントが発生したとき。これDataChangedEventにより、モデルに渡されるa が起動され、常に同期が保たれます。そして、モデルが変化する場所、つまり、モデルがリッスンするバックグラウンドイベントの場合、ビューはを上げるという同じアイデアによって更新されDataChangedEventます。ユーザーが変更をコミットSaveEventしようとすると、モデルが起動して保存されます。この場合、モデルはビューのデータを模倣し、アクションを処理します。 #b1と同様ですが、ビューは常にモデルと同期しません。代わりに、ユーザーが変更をコミットしたい場合に起動SaveEventされ、プレゼンターは最新の詳細を取得してモデルに渡します。この場合、モデルは、それに基づいて行動する必要があるまでビューデータを認識しません。その場合、必要なすべての詳細が渡されます。 セクションC ビュー内のビジネスオブジェクト、つまりプリミティブデータ(int、double)ではなくオブジェクト(MyClass)の表示 ビューには、ドメイン/ビジネスオブジェクトとして表示されるすべてのデータのプロパティフィールドがあります。ビューはこれらをTreeViewのノードに処理しますが、プロパティをview.Animals公開するなどIEnumerable<IAnimal>。次に、選択した動物について、プロパティSelectedAnimalとして公開しIAnimalます。 ビューはドメインオブジェクトの知識を持たず、プリミティブ/フレームワーク(.Net / Java)に含まれるオブジェクトタイプのみのプロパティを公開します。この場合、プレゼンターはアダプターオブジェクトにドメインオブジェクトを渡し、アダプターは特定のビジネスオブジェクトをビューに表示されるコントロールに変換します。この場合、アダプターは、ビューだけでなく、ビューの実際のコントロールにアクセスできる必要があるため、より緊密に結合されます。 セクションD 単一のコントロールを作成するために使用される複数のビュー。つまり、さまざまなタイプのオブジェクトを保存するような単純なモデルを持つ複雑なビューがあります。適切なコントロールが表示される項目をクリックするたびに、メニューシステムを横に配置できます。 ビューインターフェイスを介して公開される個々のコントロールすべてを含む1つの巨大なビューを作成します。 いくつかのビューがあります。メニュー用のビューとブランクパネルが1つあります。このビューは、必要な他のビューを作成しますが、表示しません(visible = false)。このビューは、含まれる各ビュー(子ビュー)のインターフェイスも実装するため、1人のプレゼンターに公開できます。空白のパネルには、他のビュー(Controls.Add(myview))および((myview.visible = true)が表示されます。これらの「子」ビューで発生したイベントは、親ビューによって処理されます。親ビューは、イベントをプレゼンターに渡し、逆もまた同様です。 メインビューであれ小さなビューであれ、それぞれのビューは、それぞれ独自のプレゼンターとモデルに配線されます。ビューコントロールを既存のフォームに文字通りドロップするだけで、機能の準備が整い、舞台裏でプレゼンターに配線するだけで済みます。 セクションE すべてにインターフェースがある場合、上記の例でMVPがどのように行われるかに基づいて、相互互換性がない可能性があるため、この回答に影響します。 すべてには、View、Presenter、Modelというインターフェースがあります。これらのそれぞれは、明らかに具体的な実装を持っています。具体的なビューが1つしかない場合でも、モデルとプレゼンター。 ビューとモデルにはインターフェースがあります。これにより、ビューとモデルが異なります。プレゼンターは、ビューおよびモデルオブジェクトを作成/指定され、それらの間でメッセージを渡すだけです。 ビューのみにインターフェースがあります。モデルには静的メソッドがあり、作成されないため、インターフェースは不要です。別のモデルが必要な場合、プレゼンターは静的クラスメソッドの別のセットを呼び出します。モデルは静的であるため、プレゼンターへのリンクはありません。 個人的な考え 私が提示したすべての異なるバリエーション(ほとんどはおそらく何らかの形で使用しました)から、さらに多くのバリエーションがあると確信しています。A3は、MVPの外でビジネスロジックを再利用可能に保つこと、A2はデータの重複を減らし、発生するイベントを減らすことを好みます。C1は別のクラスに追加しないため、少量のユニットテスト不可能なロジックをビューに入れます(ドメインオブジェクトの視覚化方法)が、これはコードレビューするか、アプリケーションで単に表示することができます。ロジックが複雑な場合、アダプタークラスに同意しますが、すべての場合に同意するわけではありません。セクションDの場合、D1はメニューの例としては大きすぎるビューを作成すると感じています。以前にD2とD3を使用しました。D2の問題は、イベントをプレゼンターとの間で適切な子ビューにルーティングするために大量のコードを記述する必要があり、ドラッグ/ドロップ互換性がないことです。新しいコントロールごとに、単一のプレゼンターをサポートするためにより多くの配線が必要です。D3は私の好みの選択肢ですが、ビューが非常に単純であるか、再利用する必要がない場合でも、ビューを処理するプレゼンターおよびモデルとしてさらに多くのクラスを追加します。D2とD3の混合物は、状況に基づいて最適だと思います。セクションEに関しては、インターフェースを持つものはすべてやりすぎだと思うので、ドメイン/ビジネスオブジェクトに対しては既にそれを行っており、そうすることで「デザイン」に利点がないことがよくありますが、テストでオブジェクトをモックするのに役立ちます。個人的には、E2を古典的なソリューションと考えていますが、E3は以前に取り組んだ2つのプロジェクトで使用されています。D2とD3の混合物は、状況に基づいて最適だと思います。セクションEに関しては、インターフェースを持つものはすべてやりすぎだと思うので、ドメイン/ビジネスオブジェクトに対しては既にそれを行っており、そうすることで「デザイン」に利点がないことがよくありますが、テストでオブジェクトをモックするのに役立ちます。個人的には、E2を古典的なソリューションと考えていますが、E3は以前に取り組んだ2つのプロジェクトで使用されています。D2とD3の混合物は、状況に基づいて最適だと思います。セクションEに関しては、インターフェースを持つものはすべてやりすぎだと思うので、ドメイン/ビジネスオブジェクトに対しては既にそれを行っており、そうすることで「デザイン」に利点がないことがよくありますが、テストでオブジェクトをモックするのに役立ちます。個人的には、E2を古典的なソリューションと考えていますが、E3は以前に取り組んだ2つのプロジェクトで使用されています。 質問 MVPを正しく実装していますか?適切な方法はありますか? バリエーションのあるマーティン・ファウラーの作品を読んだことがあり、MVCを始めたとき、コンセプトを理解していましたが、エントリポイントがどこにあるのか、すべてが独自の機能を持っていますが、オリジナルを制御して作成するものは元々理解できませんでしたMVCオブジェクトのセット。

5
ソフトウェアの設計をより効果的にキャプチャできないのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 エンジニアとして、私たちは皆、アーティファクト(建物、プログラム、回路、分子など)を「設計」します。それは、何らかの結果(design-the-noun)を生成するアクティビティ(design-the-verb)です。 私たちは皆、design-the-nounがアーティファクト自体とは異なるエンティティであることに同意すると思います。 ソフトウェアビジネス(実際、製品成果物の強化が必要なビジネス)の主要な活動は、「デザイン(名詞)」を理解することです。しかし、私たちは、コミュニティとして、コードベースに関する事実を再発見するために人々が注いだ努力の量によって証明されるように、それを記録するのにほとんど完全に失敗しているように見えます。誰かにコードの設計を見せて、何が得られるかを見てもらいます。 ソフトウェアの設計には次のようなものがあると思います。 ソフトウェアが何をすべきか、およびそれがどれだけうまく機能するかについての明示的な仕様 コードの明示的なバージョン(この部分は簡単で、誰もが持っています) コードの各部分が仕様を達成するためにどのように機能するかについての説明(例えば、仕様フラグメントとコードフラグメント間の関係) 根拠のコードは、それがある方法です理由として(例えば、なぜ特定の選択ではなく別のものより) デザインではないものは、コードに関する特定の観点です。たとえば、[特に選択しない] UMLダイアグラムは設計ではありません。むしろ、これらはコードから派生できるプロパティ、または間違いなくコードから派生したいプロパティです。ただし、一般的なルールとして、UMLからコードを派生させることはできません。 なぜ50年以上ソフトウェアを構築してきたのに、これを定期的に表現する方法がないのでしょうか?(明示的な例で私と矛盾することをお気軽に!) たとえそうだとしても、コミュニティのほとんどは「コード」を取得することに集中しているようで、とにかくdesign-the-nounは失われます。(私見、デザインがエンジニアリングの目的になり、デザインからアーティファクトが抽出されるまで、これを回避するつもりはありません)。 デザインを記録するための手段としてあなたは何を見ましたか(私がそれを説明した意味で)?論文への明示的な言及は良いでしょう。特定の一般的な手段が成功しなかったのはなぜだと思いますか?これをどのように変更できますか? [ 上記の箇条書きの視点を具体化する独自のアイデアを持っていますが、他の人の答えに興味があります...そして私のスキームを実装するのは難しいです[そしておそらくそれが本当の問題です:-]] EDIT 2011/1/3:answer-threadsは、「文書化」(おそらくテキスト形式、特に非形式的)が適切である可能性があることを示唆しています。私はこれを信じていないことを明確にする必要があると思います。CASEツールは80年代からシーンに登場しましたが、初期のツールはほとんど、あなたが描いたものの図のピクセルをキャプチャしただけでした。ツールはほぼ間違いなく商業的に成功しましたが、実際にはあまり役に立ちませんでした。重要な洞察は、追加の「設計」アーティファクトが正式に解釈可能でない場合、深刻なツールヘルプを取得できないことでした。同じ洞察は、デザインキャプチャの長期的に有用な形式にも当てはまると思います。形式的な構造がなければ、実際に使用することはできません。テキスト文書はこのテストにほとんど失敗します。

10
大規模な会議で優れたデザインをいかに効果的に「販売」するか
私は何度も悲しい悲劇を目の当たりにしました。発生することは次のとおりです。 新しいプロジェクトのチーム設計レビュー。 かなりの数の穴があるシンプルなデザインが見えます。 何気なく穴とそれらを回避する方法に言及します。 警告は「実生活では決して起こらない」などのコメントでは無視されます 最終的に「決して起こらない」ことが起こる 壊れたプロジェクトの緊急チーム設計レビュー。 だから私は何をしますか?「私はあなたにそう言った」という態度を取り除いても、友人を獲得し、人々に影響を与えるつもりはありません。とにかく、時が経つとステップ3のコメントが忘れられることがあります。私は間違いなく、世界に落とし穴を思い出させる迷惑な害虫になりたくありません。タイタニック号がヨーロッパに向かっているのをよく見ます。 悪いデザインが前進するのを見るとイライラします。また、現在のパスの保留中の危険性を他の人に納得させることができないように思われることもイライラします。私は、チーム会議で最悪のことをします。そこでは、誰もが異なる用語を理解する異なる方法を持っています。また、エゴは理性と思考に勝つ傾向があります。グループの人々にいくつかの新しい複雑なアイデアを使うよう説得するための良い戦術を探しています。
14 design  team 

4
明らかな抽象化のないコード複製
コードの行を見たときに、ロジックにおけるその役割を忠実に説明するテーマの抽象化に適合できないコード重複のケースに遭遇したことはありますか?それに対処するために何をしましたか? これはコードの複製であるため、理想的には、たとえば独自の機能を作成するなどの屈折処理を行う必要があります。しかし、コードはそれを記述するための優れた抽象化を持たないため、結果は奇妙な関数になり、良い名前を見つけることすらできず、ロジックの役割はそれを見ただけでは明らかではありません。それは、私にとって、コードの明快さを傷つけます。明快さを保持し、そのままにしておくことはできますが、保守性が損なわれます。 このようなものに対処する最良の方法は何だと思いますか?

3
DRYおよびOODによるコードカップリングの導入
DRYとコードの結合に関するガイダンスを探しています。私は自分のコードを複製したくないし、無関係なモジュール間のコードの結合も嫌いです。そのため、複製が導入されてから1年後に同一の重複コードが見つかった場合、重複コードをリファクタリングします。しかし、現実の世界がはるかに予測不可能な状況を経験し、コードをリファクタリングした後、コードを再度フォークする必要がある状況が発生しています。 たとえば、ガソリン車、ガソリンSUV、電気自動車、電気SUVを処理するコードがあった場合、「コード」を「ガソリン」階層と「電気」階層にリファクタリングするとします。どちらも「車両」階層から派生しています。ここまでは順調ですね。そして、私の会社はハイブリッド車とハイブリッドセミを導入します。これには、元の階層自体に中核的な変更が必要になります。たぶん、ガソリンと電気階層の間の「組成」が必要になるでしょう。 上記のすべての製品に共通する変更を実装するのにかかる時間が長くなるため、明らかにコードの複製が悪いことです。しかし、一般的なコードをリファクタリングすると、製品固有のバリエーションを導入することも同様に難しくなり、バグを修正するためにコードの行を見つけなければならない場合に多くの「クラスジャンプ」が発生します。すべての子孫の間でトリガー回帰のバグをトリガーします。 DRYと不要なコードカップリングの最適なバランスをどのように実現しますか?
14 design  dry  coupling 

3
異なるバージョンのソフトウェア間でファイルの後方互換性を許可するための優れた設計とは何ですか?
異なるバージョンのソフトウェア間でファイルタイプの後方互換性を許可するための優れた設計とは何ですか? たとえば、Microsoftはどのようにして2007、2010、2013などの単語をすべての開いているdocxファイルに取得しますが、異なるエディションではより多くの/少ないデータを保存し、わずかに異なる方法でデータをすべて同じファイルタイプに保存できますあるバージョンで保存されたファイルは別のバージョンで開くことができますが、ファイルの特定の要素は古いバージョンでは使用できない可能性がありますか? つまり、それを行うための本当に明白な方法は、 private string openfile(string filename) { File.Open(filename) ... some logic that gets a header from the file that will never change switch (fileversion) case 2007: ..... case 2010 ..... case 2013 ..... } しかし、それは信じられないほどモノリシックで、あまり拡張性がなく、多くのコピー/貼り付けコードにつながる可能性があります。 だから私は、ファイルに存在する必要があるヘッダーなどの不変の構造、およびシリアル化/逆シリアル化に必要なメソッドを定義するすべてのバージョンのベースインターフェイスを使用することを考えていましたインターフェースを実装する新しいバージョンのクラスは古いバージョンを継承し、ファイルがほとんど同じであるため、変更されたもののみをオーバーライドします。 ファイルの構造についてはあまり気にしません。XMLを使用することは既に決まっているので、最初のスキーマは概して決定済みです。ただし、将来的には間違いなく変更されることになるので、これらの変更に容易に対応できるようにコードを設計できるようにしたいだけです。

3
DAOはシングルトンである必要がありますか?
RESTful APIを開発しており、リソースにDAOを使用すると便利だと思います。メモリを使用してそれらを格納するだけですが、使用することに決めた場合はライブラリを使用しているユーザーのドアを閉めたくないためです。 DAOのデータベース実装。 私の質問は、DAOがシングルトンであるかどうかです。そうでない場合、サービスにはDAOのインスタンスがあり、おおよそ次のようになります。 @Path("eventscheduler") public class EventSchedulerService { private IEventSchedulerDao dao = new EventSchedulerDao(); // in case a different implementation is to be used public void setEventSchedulerDao(IEventSchedulerDao dao) { this.dao = dao; } @Path("{uniqueName}") @GET @Produces(MediaType.APPLICATION_JSON) public Tournament getTournament(@PathParam("name") String uniqueName) { return dao.get(uniqueName); } @Path("create") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) …

7
大幅な分岐なしで戦略パターンを実装できますか?
Strategyパターンは、巨大なif ... elseコンストラクトを回避し、機能の追加または置換を容易にするためにうまく機能します。しかし、それでも私の意見には1つの欠陥が残っています。どの実装でも、分岐構造が必要であるようです。ファクトリまたはデータファイルの可能性があります。例として、注文システムを取り上げます。 工場: // All of these classes implement OrderStrategy switch (orderType) { case NEW_ORDER: return new NewOrder(); case CANCELLATION: return new Cancellation(); case RETURN: return new Return(); } この後のコードは心配する必要はなく、新しい注文タイプを追加する場所は1つだけですが、このセクションのコードはまだ拡張できません。データファイルにそれを引き出すことは、読みやすさをいくらか助けます(議論の余地があります、私は知っています): <strategies> <order type="NEW_ORDER">com.company.NewOrder</order> <order type="CANCELLATION">com.company.Cancellation</order> <order type="RETURN">com.company.Return</order> </strategies> しかし、これにより、データファイルを処理するための定型コードが追加されます。付与された、より簡単にユニットテスト可能で、比較的安定したコードですが、それでも複雑さが増します。 また、この種のコンストラクトは統合テストがうまくいきません。個々の戦略は今すぐテストする方が簡単かもしれませんが、追加するすべての新しい戦略はテストの複雑さを増すことになります。パターンを使用していなかった場合よりも少ないですが、それはまだあります。 この複雑さを緩和する戦略パターンを実装する方法はありますか?それとも、これはそれと同じくらい簡単で、さらに先へ進んでも、抽象化の別の層を追加するだけで、ほとんどまたはまったく利益がありませんか?

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