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

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

7
URI対クエリ文字列によるREST APIの設計
次のような3つのリソースがあるとします。 Grandparent (collection) -> Parent (collection) -> and Child (collection) 上記は、これらのリソース間の関係を示しています。各祖父母は、1つまたは複数の親にマップできます。各親は、1つまたは複数の子にマップできます。子リソースに対する検索をサポートする機能が必要ですが、フィルター条件があります。 クライアントが祖父母へのID参照を渡した場合、その祖父母の直接の子孫である子供に対してのみ検索したいです。 クライアントが親へのID参照を渡した場合、親の直接の子孫である子に対してのみ検索したいです。 私はそのようなことを考えました: GET /myservice/api/v1/grandparents/{grandparentID}/parents/children?search={text} そして GET /myservice/api/v1/parents/{parentID}/children?search={text} 上記の要件に対して、それぞれ。 しかし、私はこのようなこともできます: GET /myservice/api/v1/children?search={text}&grandparentID={id}&parentID=${id} この設計では、クライアントにクエリ文字列のいずれかを渡すことができます:grandparentIDまたはparentIDのいずれかで、両方ではありません。 私の質問は: 1)どのAPI設計がよりRESTfulであり、その理由は何ですか?意味的には、同じ意味であり、同じように動作します。URIの最後のリソースは「子」であり、事実上、クライアントが子リソースを操作していることを意味します。 2)クライアントの観点からの理解可能性、およびデザイナーの観点からの保守性という点で、それぞれの長所と短所は何ですか。 3)リソースの「フィルタリング」以外に、実際に使用されるクエリ文字列は何ですか?最初の方法を使用する場合、フィルターパラメーターは、クエリ文字列パラメーターではなく、パスパラメーターとしてURI自体に埋め込まれます。 ありがとう!
73 design  rest  api 

7
通常のパスに従うか、早期に失敗する必要がありますか?
コードコンプリートブック以下の引用が来ます: 「通常の場合は、後ではifなく後に入力しますelse」 つまり、標準パスからの例外/偏差をelseケースに入れる必要があります。 しかし、プラグマティックプログラマーは「早くクラッシュする」ことを教えています(p。120)。 どのルールに従うべきですか?
73 design 

11
寿命が40年以上のWebアプリケーションの設計に関するアドバイス
シナリオ 現在、私はヘルスケアプロジェクトの一員であり、その主な要件は、ヘルスケアプロバイダーがユーザーが作成したフォームを使用して、未知の属性を持つデータをキャプチャすることです。2番目の要件は、データの整合性が重要であり、アプリケーションが40年以上使用されることです。現在、過去40年間のクライアントのデータをさまざまなソース(紙、Excel、Accessなど)からデータベースに移行しています。将来の要件は次のとおりです。 フォームのワークフロー管理 フォームのスケジュール管理 セキュリティ/ロールベースの管理 報告エンジン モバイル/タブレットのサポート 状況 わずか6か月で、現在の(契約している)アーキテクト/シニアプログラマーが「高速」アプローチを採用し、貧弱なシステムを設計しました。データベースは正規化されず、コードは結合され、層には専用の目的がなく、データベースで「削除」を実行するようにいくつかのBeanを設計したため、データが失われ始めています。コードベースは非常に肥大化しており、データベースが正規化されていないため、データを同期するだけのジョブがあります。彼のアプローチは、欠落したデータを復元するためにバックアップジョブに依存することであり、リファクタリングを信じていないようです。 私の調査結果をPMに提出したので、建築家は契約が終了すると削除されます。このアプリケーションを再設計するタスクが与えられました。私のチームは私と1人のジュニアプログラマで構成されています。他のリソースはありません。このシステムの再構築に集中できる6か月の要件凍結が認められました。 DrupalのようなCMSシステムを使用することをお勧めしましたが、クライアントの組織のポリシー上の理由により、システムをゼロから構築する必要があります。 寿命が40を超えるシステムを設計するのはこれが初めてです。私は3〜5年の寿命を持つプロジェクトにしか取り組んでいません。そのため、この状況は非常に新しいものですが、刺激的です。 ご質問 どのような設計上の考慮事項が、システムをより「将来性のある」ものにしますか? システムをより「将来の証拠」にするために、クライアント/ PMにどのような質問をする必要がありますか?

9
なぜ部分クラスを使用するのですか?
私の理解では、このpartialキーワードはクラスを複数のソースファイルに分割することを許可するだけです。コードの整理以外にこれを行う理由はありますか?生成されたUIクラスで使用されているのを見ました。 キーワード全体を作成するのは不十分な理由のようです。クラスが複数のファイルを必要とするのに十分な大きさである場合、おそらくあまりにも多くのことを行っています。どこかで完了させる別のプログラマーのためにクラスを部分的に定義するために使用できると思いましたが、抽象クラスを作成する方が良いでしょう。

12
SQL:空の文字列とNULL値
私はこの主題が少し物議を醸すことを知っています、そして、インターネットの周りに浮かんでいる多くの様々な記事/意見があります。残念ながら、それらのほとんどは、その人がNULLと空の文字列の違いを知らないことを前提としています。そのため、結合/集計を使用した驚くべき結果についてのストーリーを伝え、一般にもう少し高度なSQLレッスンを行います。これを行うことで、彼らは絶対に全体のポイントを見逃し、したがって私にとって役に立たない。したがって、この質問とすべての回答が主題を少し前進させることを願っています。 個人情報(名前、生年月日など)を含むテーブルがあり、列の1つがvarchar型の電子メールアドレスであるとします。何らかの理由で、一部の人々は電子メールアドレスを提供したくないかもしれません。このようなデータ(電子メールなし)をテーブルに挿入する場合、2つの選択肢があります。セルをNULLに設定するか、空の文字列( '')に設定します。あるソリューションを別のソリューションよりも選択することの技術的な影響をすべて把握しており、どちらのシナリオでも正しいSQLクエリを作成できると仮定します。問題は、両方の値が技術レベルで異なっていても、論理レベルでまったく同じであることです。NULLと ''を見た後、私はただ一つの結論に達しました:その男のメールアドレスがわかりません。どんなに頑張っても NULLまたは空の文字列を使用して電子メールを送信できなかったため、明らかにほとんどのSMTPサーバーは私のロジックに同意します。そのため、値がわからない場合はNULLを使用する傾向があり、空の文字列は悪いことだと考えます。 同僚との激しい議論の後、2つの質問がありました。 不明な値に空の文字列を使用すると、データベースが事実について「嘘をつく」ことになりますか?もっと正確に言うと、何が価値で何がそうでないのかというSQLの考えを使用して、結論が出るかもしれません。しかし、その後、電子メールを送信しようとすると、矛盾した結論に達します。いいえ、電子メールアドレスがないため、@!#$データベースは嘘をついているはずです。 空の文字列 ''が重要な情報(値と値なし以外)の非常に優れたキャリアになる可能性のある論理的なシナリオはありますか?空の文字列を実際の値やNULLと一緒に使用するのが良い場合があると主張する多くの投稿を見てきましたが、これまでのところ(SQL / DB設計の観点から)論理的なシナリオは見ていません。 PS一部の人々は、個人的な好みの問題であると答えたいと思うでしょう。私は同意しません。私にとって、それは重要な結果を伴う設計上の決定です。だから、これについての意見がいくつかの論理的および/または技術的理由によって裏付けられている答えを見てみたい。
72 design  database  sql  strings  null 

7
C#で拡張メソッドを持つインターフェイスの代わりに抽象クラスを使用する場合
「抽象クラス」と「インターフェース」は類似した概念であり、インターフェースはより抽象的な概念です。1つの差別化要因は、抽象クラスが必要なときに派生クラスのメソッド実装を提供することです。ただし、C#では、この差別化要因は、インターフェイスメソッドの実装を提供できる拡張メソッドの最近の導入によって削減されました。別の差別化要因は、クラスが1つの抽象クラスのみを継承できる(つまり、多重継承がない)が、複数のインターフェイスを実装できることです。これにより、インターフェイスの制限が緩和され、柔軟性が高まります。それでは、C#では、拡張メソッドを備えたインターフェイスの代わりに抽象クラスをいつ使用すべきでしょうか? インターフェイス+拡張メソッドモデルの注目すべき例はLINQです。ここではIEnumerable、多数の拡張メソッドを介して実装されるすべてのタイプに対してクエリ機能が提供されます。

10
提案された設計は通常、同僚の設計よりも悪いです-どうすれば良くなりますか?[閉まっている]
私は数年プログラミングしており、問題の修正や中小規模のスクリプトの作成に関しては一般的には優れていますが、オブジェクト指向の方法で大規模なプログラムを設計することは一般的に得意ではありません。いくつかの質問 最近、私と同じ年数の経験を持つ同僚と私は問題に取り組んでいた。私は彼よりも長い間問題に取り組んでいましたが、彼はより良い解決策を思いついたので、最終的には彼のデザインを使用します。これは本当に私に影響を与えました。私は彼のデザインが優れていると認めていますが、彼と同じくらい良いデザインを思いつきました。私も仕事を辞めることを考えています。理由は定かではありませんが、突然、プレッシャーを感じています。たとえば、後輩が私についてどう思うかなどです。普通ですか?それとも、これについて少し考えすぎていますか? 私の仕事は、Pythonでのプログラミングです。ソースコードを読み込もうとしていますが、デザインスキルをどのように向上できると思いますか?勉強すべき良い本やソフトウェアはありますか? 教えてください あなたの助けに本当に感謝します。

12
「すべてが地図です」、私はこれを正しくしていますか?
Stuart Sierraの講演「Thinking In Data」を見て、私が作っているこのゲームのデザイン原則として、そのアイデアの1つを取り上げました。違いは、彼はClojureで働いており、私はJavaScriptで働いていることです。その点で私たちの言語にはいくつかの大きな違いがあります Clojureは慣用的に機能するプログラミングです ほとんどの状態は不変です 「すべては地図です」というスライドからアイデアを取りました(11分、6秒から29分以上)。彼が言うことは次のとおりです。 2〜3個の引数をとる関数を見たときはいつでも、それをマップに変換してマップを渡すだけのケースを作成できます。これには多くの利点があります。 引数の順序を心配する必要はありません 追加情報を心配する必要はありません。余分なキーがある場合、それは私たちの関心事ではありません。ただ流れるだけで、干渉しません。 スキーマを定義する必要はありません オブジェクトを渡すのとは対照的に、データの非表示はありません。しかし、彼はデータの隠蔽が問題を引き起こす可能性があり、過大評価されていると主張しています。 性能 実装のしやすさ ネットワークまたはプロセスを介して通信するとすぐに、とにかくデータ表現について双方に同意する必要があります。これは、データだけを扱う場合はスキップできる余分な作業です。 私の質問に最も関連しています。これは、「機能を構成可能にする」で29分です。概念を説明するために彼が使用するコードサンプルは次のとおりです。 ;; Bad (defn complex-process [] (let [a (get-component @global-state) b (subprocess-one a) c (subprocess-two a b) d (subprocess-three a b c)] (reset! global-state d))) ;; Good (defn complex-process [state] (-> state subprocess-one subprocess-two subprocess-three)) …

4
インターフェースに「オプションのメソッド」を使用してJavaコレクションが実装されたのはなぜですか?
Javaコレクションフレームワークを拡張する最初の実装中に、オプションとして宣言されたメソッドがコレクションインターフェイスに含まれているのを見て驚いた。実装者は、サポートされていない場合、UnsupportedOperationExceptionsをスローすることが期待されています。これはすぐに、貧弱なAPIデザインの選択肢として私を驚かせました。 Joshua Blochの優れた「Effective Java」の本を多く読んだ後、彼がこれらの決定に責任を負う可能性があることを知った後、本で支持されている原則と一致しなかったようです。コレクションと、「オプション」メソッドでコレクションを拡張するMutableCollectionの2つのインターフェイスを宣言すると、はるかに保守性の高いクライアントコードにつながると思います。 ここに問題の優れた要約があります。 2つのインターフェイスの実装の代わりにオプションのメソッドが選択された理由はありますか?

7
関数が意図した動作を実行する前にnullチェックを実行する必要がある場合、これは悪い設計ですか?
だから、これが良いコード設計なのか悪いコード設計なのかはわからないので、私は尋ねた方が良いと思った。 クラスを含むデータ処理を行うメソッドを頻繁に作成し、メソッドで多くのチェックを行って、null参照やその他のエラーを事前に取得しないようにします。 非常に基本的な例: // fields and properties private Entity _someEntity; public Entity SomeEntity => _someEntity; public void AssignEntity(Entity entity){ _someEntity = entity; } public void SetName(string name) { if (_someEntity == null) return; //check to avoid null ref _someEntity.Name = name; label.SetText(_someEntity.Name); } そのため、毎回nullをチェックするimを見ることができます。しかし、メソッドはこのチェックを行うべきではありませんか? たとえば、外部コードが事前にデータをクレンジングして、メソッドが以下のように検証する必要がないようにする必要があります。 if(entity != null) // this …
67 c#  design  validation 

12
エラーをスローすべきかどうかを示すフラグを持っている
私は最近、かなり古い開発者(50歳以上)がいる場所で働き始めました。彼らは、システムがダウンすることができなかった航空を扱う重要なアプリケーションに取り組んできました。その結果、古いプログラマーはこの方法でコーディングする傾向があります。 彼は、オブジェクトにブール値を入れて、例外をスローすべきかどうかを示す傾向があります。 例 public class AreaCalculator { AreaCalculator(bool shouldThrowExceptions) { ... } CalculateArea(int x, int y) { if(x < 0 || y < 0) { if(shouldThrowExceptions) throwException; else return 0; } } } (このプロジェクトでは、その時点では存在できないネットワークデバイスを使用しようとしているため、メソッドは失敗する可能性があります。エリアの例は、例外フラグの例にすぎません) 私にはこれはコードの匂いのようです。毎回例外フラグをテストする必要があるため、単体テストの作成は少し複雑になります。また、何か問題が発生した場合、すぐに知りたいと思いませんか?続行方法を決定するのは呼び出し側の責任ではないでしょうか? 彼の論理/推論は、プログラムがユーザーにデータを表示するという1つのことをする必要があるということです。それを妨げないその他の例外は無視する必要があります。私はそれらが無視されるべきではないことに同意しますが、バブルアップして適切な人によって処理されるべきであり、そのためのフラグを処理する必要はありません。 これは例外を処理する良い方法ですか? 編集:設計上の決定についてより多くのコンテキストを与えるために、このコンポーネントが失敗した場合でも、プログラムは引き続き動作し、メインタスクを実行できるためだと思います。したがって、例外をスローしたくない(そして、それを処理しない?)ので、ユーザーが正常に動作しているときにプログラムを停止させます 編集2:より多くのコンテキストを与えるために、この場合、メソッドはネットワークカードをリセットするために呼び出されます。ネットワークカードが切断および再接続され、異なるIPアドレスが割り当てられると問題が発生します。したがって、古いIPでハードウェアをリセットしようとするため、リセットは例外をスローします。

11
単一責任の原則を明確にする
単一責任の原則では、クラスはただ1つのことを行うべきであると述べています。かなり明確な場合もあります。ただし、特定の抽象化レベルで表示したときに「1つのもの」のように見えるものは、下位レベルで表示したときに複数のものになる可能性があるため、他のものは困難です。また、単一の責任原則が低レベルで尊重されている場合、過度に分離された冗長なラビオリコードが発生し、すべての小さなクラスを作成し、実際の問題を解決するよりも情報を配管することに多くの行が費やされる可能性があります。 「一つのこと」の意味をどのように説明しますか?クラスが実際に「1つのこと」以上のことを行う具体的な兆候は何ですか?


14
MVCアンチOOPではありませんか?
OOPの背後にある主な考え方は、単一のエンティティ(オブジェクト)でデータと動作を統合することです。手続き型プログラミングには、データと、データを変更する個別のアルゴリズムがあります。 Model-View-Controllerパターンでは、データとロジック/アルゴリズムはそれぞれ別個のエンティティ、モデル、コントローラーに配置されます。同等のOOPアプローチでは、モデルとコントローラーを同じ論理エンティティに配置するべきではありませんか?


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