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

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

2
Google検索をどのように実装しますか?[閉まっている]
インタビューで「Google検索をどのように実装しますか?」そのような質問にどう答えますか?Googleの一部の実装方法を説明するリソース(BigTable、MapReduce、PageRankなど)があるかもしれませんが、これはインタビューに完全には適合しません。 どのような全体的なアーキテクチャを使用しますか?また、これを15〜30分でどのように説明しますか? 最初に、約1万件のドキュメントを処理する検索エンジンの構築方法の説明から始め、シャーディングを介して約5,000万ドキュメントに拡張し、その後、別のアーキテクチャ/技術的飛躍を実現します。 これは、20,000フィートのビューです。私が望んでいるのは詳細です-あなたがインタビューで実際にそれに答える方法です。どのデータ構造を使用しますか。アーキテクチャで構成されているサービス/マシン。典型的なクエリレイテンシはどうなりますか?フェイルオーバー/スプリットブレインの問題はどうですか?等...

10
単体テストは設計をどのように促進しますか?
私たちの同僚は、ユニットテストの作成を、実際に設計を改良し、リファクタリングするのに役立つものとして推進していますが、その方法はわかりません。CSVファイルを読み込んで解析する場合、ユニットテスト(フィールドの値の検証)は設計の検証にどのように役立ちますか?彼は結合やモジュール性などに言及しましたが、私にはあまり意味がありません-しかし、私は理論的な背景があまりありません。 それはあなたが重複とマークした質問と同じではありません。私は、「それが役立つ」という理論だけでなく、これがどのように役立つかの実際の例に興味があります。私は以下の回答とコメントが好きですが、もっと学びたいです。

7
ビジネスロジックでのデータベース値の参照
これはハードコーディングとベストプラクティスに関する別の質問だと思います。データベースに保存されている値のリストがあるとしましょう(テーブルはSSRSレポートなどの他の目的に使用されるため、データベースに存在する必要があります)。 1 Apple 2 Banana 3 Grapes それらをユーザーに提示し、ユーザーが1つ選択すると、FavouriteFruitとしてプロファイルに保存され、IDがデータベースのレコードに保存されます。 ビジネスルール/ドメインロジックに関しては、特定の値にロジックを割り当てるための推奨事項は何ですか。ユーザーがGrapesを選択した場合、追加のタスクを実行したい場合、Grapes値を参照する最良の方法は次のとおりです。 // Hard coded name if (user.FavouriteFruit.Name == "Grapes") // Hard coded ID if (user.FavoriteFruit.ID == 3) // Grapes // Duplicate the list of fruits in an enum if (user.FavouriteFruit.ID == (int)Fruits.Grapes) または、他の何か? もちろん、FavouriteFruitはアプリケーション全体で使用されるため、リストは追加または編集できます。 誰かが「ブドウ」の名前を「ブドウ」に変更したいと思うかもしれませんが、これはもちろんハードコードされた文字列オプションを壊します。 ハードコードされたIDは完全には明確ではありませんが、示されているように、コメントを追加するだけで、どのアイテムであるかをすばやく識別できます。 enumオプションには、データベースからのデータの複製が含まれますが、同期が取れなくなる可能性があるため、間違っているようです。 とにかく、コメントや提案を事前に感謝します。
43 design 

7
依存関係反転の原則を適用しない場合
現在、SOLIDを把握しようとしています。したがって、依存関係反転の原則は、任意の2つのクラスが直接ではなく、インターフェースを介して通信することを意味します。例:class Aメソッドがあり、typeのオブジェクトへのポインターを予期するclass B場合、このメソッドは実際にtypeのオブジェクトを予期する必要がありますabstract base class of B。これは、オープン/クローズにも役立ちます。 私が正しく理解していれば、私の質問は、これをすべてのクラスの相互作用に適用するのが良い習慣であるか、レイヤーの観点から考えてみるべきですか? 私が懐疑的である理由は、この原則に従うためにいくらかの代価を払っているからです。たとえば、featureを実装する必要がありますZ。分析後Z、機能はA、Bおよびで構成されていると結論付けCます。私が作成ファサードクラスはZ、それは、インタフェースを介して、クラスを使用していますA、BとC。私は実装をコーディングを開始し、いくつかの点で私は、そのタスクを実現するZ実際の機能で構成されA、BそしてD。次に、Cインターフェイス、Cクラスプロトタイプを破棄し、Dインターフェイスとクラスを個別に記述する必要があります。インターフェイスがなければ、クラスのみを置き換える必要があります。 つまり、何かを変更するには、1。呼び出し元2.インターフェイス3.宣言4.実装を変更する必要があります。Python直接結合実装では、実装のみを変更する必要があります。

7
固い原則とヤグニ
ソリッド原則はいつYAGNIになりますか? プログラマとして、複雑さ、保守性、構築時間などの間で常にトレードオフを行います。とりわけ、選択を行うための最も賢明なガイドラインの2つは、SOLID原則とYAGNIです。必要ない場合; ビルドせず、クリーンに保ちます。 たとえば、SOLIDのダイムキャストシリーズを見ると、かなり単純なプログラムとして始まり、非常に複雑なプログラムになります(最後にはい複雑さも見る人の目にあります)。私は不思議に思う:いつ固い原則はあなたが必要としない何かに変わるのか?すべての堅固な原則は、後の段階で使用して変更を加えることを可能にする作業方法です。しかし、解決すべき問題が非常に単純で、使い捨てのアプリケーションである場合はどうでしょうか?または、SOLID原則は常に適用されるものですか? コメントで尋ねられたように: 固い原則 ヤグニ

6
アジャイルチームの主任開発者の役割は何ですか?
リード開発者以外のアジャイル開発チームでは、一般的に: 標準を設定します(コーディングなど) チームの新技術を研究する チームの技術的な方向性を設定します 問題について最終決定権を持っています システムのアーキテクチャを設計します ただし、アジャイルチームの動作は異なります。 アジャイルチームは、前もってではなく、新しいデザインに依存します アジャイルチームは、1人が設計を指示するのではなく、一緒に設計します アジャイルチームは、プロジェクトを提供するのに最適な独自の技術的方向を決定します これにより、アジャイルチームの主任開発者はどこに残りますか?アジャイルチームにリード開発者を置くことは可能ですか?アジャイルチームはリードに異なる責任を要求しますか?

7
リードが示唆するように、このプロジェクトの設計を中止して、このプロジェクトの設計を開始するにはどうすればよいですか?[閉まっている]
私はジュニア開発者(経験3年以下)であり、仕事では新しいシステムを設計しています。私の主任開発者はプリンシパルアーキテクトになりますが、彼はシステムを自分で(並行して)設計しようと挑戦しました。 アイデアをブレインストーミングし、私がアーキテクチャの提案として見たものを提案するいくつかのイテレーションの過程で、私のリードは私がやっていることのほとんどが「設計」ではなく「設計」であるというフィードバックを私に与えました。 彼は、設​​計は実装の記述であるのに対し、アーキテクチャは実装に依存しないと説明しました。彼は、デザイナーの帽子を脱ぎ、建築家の帽子をかぶる必要があると言いました。彼は私にそうする方法について少しアドバイスをくれましたが、私もあなたに尋ねたいと思います: ソフトウェアデザイナーモードから抜け出し、アーキテクトのように考え始めるにはどうすればよいですか? ここに、私が思いついた「デザイン」の例をいくつか示しますが、それは私のリードではアーキテクチャに関連するとは見なされませんでした。 私たちのシステムからリソースをロードおよびアンロードするためのアルゴリズムを思いつきました。私のリードは、アルゴリズムは明確にアーキテクチャではないと述べました。 システムが発生させる一連のイベントと、それらを発生させる順序を考え出しましたが、これもアーキテクチャとしてそれを削減するようには見えませんでした。 私は細部に巻き込まれ、十分に後退していないようです。アーキテクチャレベルの何かを思いついたとしても、さまざまな実装を試し、詳細をいじってから一般化して抽象化することで、そこにたどり着くことがよくありました。これをリードに説明したとき、彼は間違ったアプローチを取っていると言いました。「ボトムアップ」ではなく「トップダウン」を考える必要がありました。 以下に、プロジェクトに関する具体的な詳細を示します。 設計しているプロジェクトはWebアプリケーションです。 およそ10〜10万行のコードを見積もっています。 私たちは新興企業です。当社のエンジニアリングチームは約3〜5人です。 私たちのアプリケーションと比較できる最も近いものは、軽量のCMSです。同様の複雑さを持ち、主にコンポーネントのロードとアンロード、レイアウト管理、プラグインスタイルのモジュールを扱います。 アプリケーションはajax-yです。ユーザーはクライアントを一度ダウンロードしてから、サーバーに必要なデータを要求します。 MVCパターンを使用します。 アプリケーションには認証があります。 古いブラウザのサポートについてはあまり心配していません(なんと!)ので、私たちは世の中にあり、今後出てくる最新かつ最高のものを活用したいと考えています。(HTML5、CSS3、WebGL?、Media Source Extensionsなど) ここではいくつかあるプロジェクトの目標は: アプリケーションはスケーリングする必要があります。近い将来、私たちのユーザーは数百から数千のオーダーになりますが、数万から数百万以上を計画しています。 アプリケーションがいつまでも続くことを願っています。これは一時的な解決策ではありません。(実際には、私たちはすでに一時的な解決策を持っています。私たちが設計しているのは、私たちが持っているものの長期的な置き換えです)。 機密性の高い個人情報との接触がある可能性があるため、アプリケーションは安全でなければなりません。 アプリケーションは安定している必要があります。(理想的には、Gmailのレベルで安定しますが、火星探査機の極端にある必要はありません。)

6
グラフィックデザイナーと仕事をする正しい方法は何ですか?[閉まっている]
最近、グラフィックデザイナー(クライアントが手配)と協力して、作成したDjango + Bootstrapアプリケーションのスキンを提供しました。デザイナーは、いくつかの技術的属性(フォントサイズ、色、いくつかの寸法など)を説明するドキュメントとともに、新しいレイアウトの一連の静的画像を提供しました。 これを実装するには非常に時間がかかることが判明しました。サイト全体は基本的にフロントページ、インデックスページ、および6つの詳細ページでしたが、CSSとHTMLの変更を実装するだけで少なくとも5日間を費やしました。それで、私は手足に出て、これを間違った方法と呼びます。 私の基本的なアプローチは: 静的な画像と現在のレンダリングを比較して、違いに注目してください。 CSS / HTMLでどのような変更が必要かを推測します その変更を行う 手順1に進みます。 特定の問題のいくつかは、デザインに8列から12列への変更が含まれていることを理解していないことでした。ピクセルパーフェクトレンダリングなどを実現するために通常のCSSレスリングを使用します。また、特定の動作を得るために、HTMLテンプレートを再編成しなければならない場合がありました。 正しい方法は何ですか?

3
ビジネスルールの保存に構成ファイルまたはデータベースを使用する必要がありますか?
私は最近、Pragmatic Programmerを読んでいます。 詳細は、特に頻繁に変更される場合に、元のコードを台無しにします。ビジネスロジック、法律、またはその日の経営陣の個人的な好みの変化に対応するためにコードを変更する必要があるたびに、新しいバグを導入するというシステムを破壊するリスクがあります。 ハント、アンドリュー; トーマス、デビッド(1999-10-20)。実用的なプログラマー:ジャーニーマンからマスターへ(Kindle Locations 2651-2653)。ピアソン教育(米国)。キンドル版。 私は現在、値のセットからのみ取得できるプロパティを持ついくつかのモデルを持つWebアプリをプログラミングしています(Webアプリのデータは機密ではないため)。 light-> type =球/立方体/円柱 ライトのタイプは上記の3つの値のみにすることができますが、TPPに従って、値を変更して構成ファイルに配置できるように常にコーディングする必要があります。アプリ全体でこれのいくつかの事件があるので、私の質問は次のとおりです。 これらのような値を次の場所に保存する必要があります。 構成ファイル: 'light-types' => array(sphere, cube, cylinder), 'other-type' => value, 'etc' => etc-value データベース内の構成テーブルごとに1行の単一テーブル 各設定項目のテーブルを持つデータベース(例えば表:light_types;カラム:id、name) 他の方法は? 提供された支援/専門知識に感謝します。

15
基本的に組み込み関数の名前を変更する関数を作成することはお勧めできませんか?
特定のコンテキストでは、最小関数と最大関数で混乱します。 1つのコンテキストでは、関数を使用して2つの値のうちの大きい方または小さい方を取る場合、問題はありません。例えば、 //how many autographed CD's can I give out? int howManyAutographs(int CDs, int Cases, int Pens) { //if no pens, then I cannot sign any autographs if (Pens == 0) return 0; //I cannot give away a CD without a case or a case without a CD return min(CDs, …

9
TDDを行うときにロギングが必要ですか?
赤、緑、リファクタリングのサイクルを実行するときは、常にテストに合格するための最小限のコードを記述する必要があります。これは私がTDDについて教えられてきた方法であり、ほとんどすべての本がプロセスを説明する方法です。 しかし、ロギングはどうですか? 正直なところ、実際に複雑なことが起こっていない限り、アプリケーションでのログ記録はほとんど使用していませんが、適切なログ記録の重要性に関する多くの投稿を見てきました。 そのため、例外をログに記録する以外に、適切にテストされたアプリケーション(ユニット/統合/受け入れテスト)にログを記録することの本当の重要性を正当化できませんでした。 だから私の質問は: TDDを実行している場合、ログを記録する必要がありますか?テストに失敗しても、アプリケーションのどこが悪いのかわかりませんか? 各クラスの各メソッドにロギングプロセスのテストを追加する必要がありますか? たとえば、実稼働環境でいくつかのログレベルが無効になっている場合、テストと環境の間に依存関係が生じませんか? 人々はログがデバッグを容易にする方法について話しますが、TDDの主な利点の1つは、テストの失敗によって何が間違っているかを常に知っていることです。 私がそこに欠けているものはありますか?

6
Java継承の「拡張」を避ける理由
ジェイム・ゴスリングは言った 「可能な限り、実装の継承を避ける必要があります。」 代わりに、インターフェイスの継承を使用します。 しかし、なぜ?キーワード "extends"を使用してオブジェクトの構造を継承しないようにし、同時にコードをオブジェクト指向にする方法はありますか? 「書店で本を注文する」などのシナリオで、この概念を示すオブジェクト指向の例を教えてください。

7
定数を定義するインターフェースを持つのは悪い習慣ですか?
Javaでjunitテストクラスのセットを書いています。さまざまなテストクラスで必要な文字列など、いくつかの定数があります。それらを定義し、すべてのテストクラスがそれを実装するインターフェイスについて考えています。 私が見る利点は次のとおりです。 定数への簡単なアクセス:MY_CONSTANT代わりにThatClass.MY_CONSTANT 各定数は一度だけ定義されます このアプローチはむしろ良い習慣ですか、悪い習慣ですか?インターフェイスの概念を少し乱用したい気がします。 インターフェイス/定数について一般的に答えることができますが、特別なことがあれば単体テストについても答えることができます。

3
AngularJS:複数のng-appsを使用したWebアプリケーションの構造化
ブロゴスフィアには、AngularJSアプリの構造化ガイドラインに関するトピックに関する以下のような記事があります。 http://www.johnpapa.net/angular-app-structuring-guidelines/ http://codingsmackdown.tv/blog/2013/04/19/angularjs-modules-for-great-justice/ http://danorlando.com/angularjs-architecture-understanding-modules/ http://henriquat.re/modularizing-angularjs/modularizing-angular-applications/modularizing-angular-applications.html ただし、ガイドラインとベストプラクティスについてまだ触れていないシナリオの1つは、複数の「ミニスパ」アプリを含む大規模なWebアプリケーションがあり、ミニスパアプリはすべて一定量のコードを共有している場合です。 ng-app同じページに複数の宣言をしようとする場合については言及していません。むしろ、私は、独自の独自のng-app宣言がある大規模サイトのさまざまなセクションを意味します。 Scott AllenがOdeToCodeブログで次のように書いています。 あまりうまく対処できていないシナリオの1つは、同じ優れたWebアプリケーションに複数のアプリが存在し、クライアントで共有コードを必要とするシナリオです。 推奨されるアプローチ、避けるべき落とし穴、またはあなたが指し示すことができるこのシナリオの良いサンプル構造はありますか? 更新-2015年9月10日 興味深い組織戦略を持つプロジェクトの1つに、MEAN.JSとそのモジュールフォルダーがあります。 https://github.com/meanjs/mean https://github.com/meanjs/mean/tree/master/modules 別の例は、ASP.NET Music Store SPAの例です。 https://github.com/aspnet/MusicStore https://github.com/aspnet/MusicStore/tree/master/src/MusicStore.Spa/ng-apps

13
ブール値パラメーターを使用して値を決定するのは間違っていますか?
動作を決定するためにブール値パラメーターを使用するのは間違っていますか?、ブールパラメータを使用して動作を決定することを避けることの重要性を知っています。たとえば: 元のバージョン public void setState(boolean flag){ if(flag){ a(); }else{ b(); } c(); } 新しいバージョン: public void setStateTrue(){ a(); c(); } public void setStateFalse(){ b(); c(); } しかし、動作の代わりにブール値パラメーターを使用して値を決定する場合はどうでしょうか?例えば: public void setHint(boolean isHintOn){ this.layer1.visible=isHintOn; this.layer2.visible=!isHintOn; this.layer3.visible=isHintOn; } 私はisHintOnフラグを削除し、2つの別個の関数を作成しようとしています。 public void setHintOn(){ this.layer1.visible=true; this.layer2.visible=false; this.layer3.visible=true; } public void setHintOff(){ this.layer1.visible=false; this.layer2.visible=true; this.layer3.visible=false; } …

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