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

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

4
インターフェイスが他のインターフェイスを拡張する必要があります(そうすることでメソッドを継承します)
これは一般的な質問ですが、私が現在経験している問題にも固有のものです。現在、ソリューションに指定されているインターフェイスがあります public interface IContextProvider { IDataContext { get; set; } IAreaContext { get; set; } } このインターフェイスはプログラム全体でよく使用されるため、必要なオブジェクトに簡単にアクセスできます。しかし、プログラムの一部のかなり低いレベルでは、IAreaContextを使用し、それからいくつかの操作を実行する別のクラスにアクセスする必要があります。そこで、この作成を行うための別のファクトリインターフェイスを作成しました。 public interface IEventContextFactory { IEventContext CreateEventContext(int eventId); } IContextProviderを実装し、NinJectを使用して注入されるクラスがあります。私が抱えている問題は、このIEventContextFactoryを使用する必要がある領域がIContextProviderにのみアクセスでき、それ自体がこの新しいインターフェイスを必要とする別のクラスを使用することです。IEventContextFactoryのこの実装を低レベルでインスタンス化する必要はなく、むしろIEventContextFactoryインターフェース全体で動作します。ただし、コンストラクタを介して別のパラメータを挿入する必要はありません。それを必要とするクラスに渡すだけです。つまり、 // example of problem public class MyClass { public MyClass(IContextProvider context, IEventContextFactory event) { _context = context; _event = event; } public void DoSomething() …
13 c#  design  interfaces 

4
ラテンアルファベットの視覚的および聴覚的に明確なサブセット?
コード「5SBDO0」が記載されたカードを誰かに渡すと想像してください。 一部のフォントでは、文字「S」を数字の5や数字の0や文字「O」と視覚的に区別するのが困難です。 コードを大声で読むと、「B」を「D」と区別するのが難しい場合があります。「Bは男の子のように」、「Dは犬のように」と言うか、代わりに「表音アルファベット」を使用します。 ほとんどの場合、視覚的に曖昧に見えず、読み上げられたときに曖昧に聞こえない文字と数字の最大のサブセットは何ですか? バックグラウンド: できるだけ簡単に通信しながら、できるだけ多くの値をエンコードできる短い文字列を生成する必要があります。 6文字の文字列「123456」があるとします。10進数では、10 ^ 6値をエンコードできます。 16進数の「1B23DF」では、16個の ^ 6値を同じ文字数でエンコードできますが、読み上げたときにあいまいに聞こえることがあります。(「B」と「D」) 同様に、N文字の文字列の場合、(アルファベットのサイズ)^ Nの値を取得します。 文字列の長さは約6文字に制限されています。これは、人間の作業メモリ容量の容量内に簡単に収まるようにするためです。 したがって、エンコード可能な値の最大数を見つけるには、文字/数字の最大の明確なセットを見つける必要があります。GZの文字や一般的な句読点を考慮できない理由はありませんが、「GはAのように聞こえますか?」、「GはBのように聞こえますか?」、「 GはC "のように聞こえます。私たちが知っているように、これはO(n ^ 2)行うべき言語作業=)...
13 design 

8
単一責任の原則-私はそれを過度に使用していますか?
参考-http://en.wikipedia.org/wiki/Single_responsibility_principle アプリケーションの1つのモジュールで元帳エントリを作成するテストシナリオがあります。実行できる3つの基本的なタスクがあります- 既存の元帳エントリを表形式で表示します。 [作成]ボタンを使用して新しい元帳エントリを作成します。 テーブルの元帳エントリ(最初のポインタで説明)をクリックして、次のページで詳細を表示します。このページの元帳エントリを無効にすることができます。 (各ページにはさらにいくつかの操作/検証がありますが、簡潔にするためにこれらに限定します) そこで、3つの異なるクラスを作成することにしました- LedgerLandingPage CreateNewLedgerEntryPage ViewLedgerEntryPage これらのクラスはそれらのページで実行できるサービスを提供し、Seleniumテストはこれらのクラスを使用して、アプリケーションを特定のアサーションを作成できる状態にします。 私が同僚と一緒にそれをレビューしていたとき、彼は圧倒され、すべてのために1つのクラスを作るように頼まれました。まだデザインがきれいだと感じていますが、単一責任の原則を使いすぎているのではないかと疑っています

7
設計文書には、特定の設計に対する賛否両論の議論を含めるべきですか、それとも事実と理論的根拠に焦点を当てるべきですか?
私は現在、設計ドキュメントを更新して、将来の開発者向けに正しく最新のものにするためのプロセスを進めています。 現在、ドキュメントは事実のみに焦点を当てており、設計がどのようになっているかを示しています。提示された決定の根拠はありません。理論的根拠を把握することが重要だと思います。そうすることで、開発者は何かがそうである理由を知ることができます。すべての設計上の決定、特にプロジェクトに取りかかる前に下した決定に関するすべての理論的根拠を追加することはできませんが、この部門でできることをやっています。 ただし、いくつかの設計上の決定は、プロジェクトの要件を考えると、敬意を表して非常に貧弱な決定です。ただし、良いものもいくつかあります。 私の最初の考えは、将来のメンテナーの注意を集めるために、設計上の問題と潜在的な解決策またはこれらの問題の回避策についての議論を含めるべきだということでしたが、設計文書がこの種の議論と情報の場所であるかどうかはわかりません。他の人がこのシステムで作業し、ドキュメントを更新するので、デザインの「批評」が「このデザインを新しいものに引き裂く」ように雪だるまして欲しくありません。これは明らかに不適切です。 私のマネージャーがどちらの決定も支持するので、それは私次第です。私が取るアプローチに関係なく、作成されたドキュメントは公式にバージョン管理され、通常は開発作業を任される前にシステムで作業する開発者に提供されます。新しい開発者は、開発作業を開始する前に、特定のソフトウェアシステムに関連するドキュメントに慣れることが期待されています。 質問: 設計文書が未加工の事実(「これが設計」)と論理的根拠(「これが設計である理由」)に固執するか、設計上の問題となる可能性のある欠陥のない問題を指摘するために使用されるべきか将来の開発者? 設計ドキュメントを使用してこの情報をキャプチャする必要がない場合、どのタイプのドキュメントでそれをキャプチャする必要があり、その他は設計合理性、トレードオフ、および既知の問題(欠陥ではないため、欠陥を追跡するための議論)でキャプチャする必要があります他のツールを使用していますか?)

3
SOLID原則の適用
私は、SOLIDの設計原則にまったく慣れていません。私はそれらの原因と利点を理解していますが、SOLID原則を使用するための実践的な演習としてリファクタリングしたい小規模なプロジェクトにそれらを適用できません。完全に機能するアプリケーションを変更する必要はありませんが、とにかくそれをリファクタリングして、将来のプロジェクトの設計経験を積みたいと思います。 アプリケーションには次のタスクがあります(実際にはそれ以上のことですが、簡単にしましょう):データベーステーブル/列/ビューなどの定義を含むXMLファイルを読み取り、作成するために使用できるSQLファイルを作成する必要がありますORACLEデータベーススキーマ。 (注:なぜそれが必要なのか、なぜXSLTを使用しないのかなどについて議論することは控えてください。理由はありますが、トピックから外れています。) はじめに、テーブルと制約のみを見ることにしました。列を無視する場合、次のように記述できます。 制約はテーブルの一部(より正確にはCREATE TABLEステートメントの一部)であり、制約は別のテーブルを参照する場合もあります。 最初に、アプリケーションがどのように見えるかを説明します(SOLIDを適用しない): 現時点では、アプリケーションには、テーブルが所有する制約へのポインターのリストと、このテーブルを参照する制約へのポインターのリストを含む「テーブル」クラスがあります。接続が確立されるたびに、逆方向の接続も確立されます。このテーブルには、各制約のcreateStatement()関数を順に呼び出すcreateStatement()メソッドがあります。このメソッド自体は、名前を取得するために所有者テーブルと参照先テーブルへの接続を使用します。 明らかに、これはSOLIDにはまったく適用されません。たとえば、循環的な依存関係があり、必要な「追加」/「削除」メソッドといくつかの大きなオブジェクトデストラクタに関してコードが肥大化しました。 そのため、いくつか質問があります。 依存性注入を使用して循環依存関係を解決する必要がありますか?もしそうなら、Constraintはそのコンストラクタで所有者(およびオプションで参照される)テーブルを受け取るべきだと思います。しかし、単一のテーブルの制約のリストをどのように実行できますか? Tableクラスが自身の状態(テーブル名、テーブルコメントなど)とConstraintsへのリンクの両方を保存する場合、これらの1つまたは2つの「責任」は、単一責任の原則と考えられますか? ケース2.が正しい場合、リンクを管理する論理ビジネスレイヤーに新しいクラスを作成するだけですか?その場合、1は明らかに関連しなくなります。 「createStatement」メソッドは、Table / Constraintクラスの一部である必要がありますか、それともそれらを移動する必要がありますか?もしそうなら、どこへ?各データストレージクラス(つまり、テーブル、制約など)ごとに1つのマネージャークラスですか?または、リンクごとにマネージャークラスを作成します(3と同様)。 これらの質問に答えようとするたびに、どこかで輪になって走っています。 列やインデックスなどを含めると、問題は明らかにはるかに複雑になりますが、単純なテーブル/制約のことで手伝ってくれれば、残りは自分で解決できるかもしれません。

4
例外処理は分野横断的な懸念事項ですか?
例外処理とログ記録の両方の懸念は、どちらも横断的な関心事であるという点で、ほとんど違いは見られません。どう思いますか?メソッドが実装しているコアロジックとインターリーブするのではなく、単独で個別に処理すべきではありませんか? 編集:私が言いたいことは、私の意見では、メソッドの実装には実行の成功パスのロジックのみを含める必要があり、例外は他の場所で処理する必要があるということです。これは、チェック済み/未チェックの例外に関するものではありません。 たとえば、言語は次のような構造を使用して、完全にチェックされた方法で例外を処理します。 class FileReader { public String readFile(String path) { // implement the reading logic, avoid exception handling } } handler FileReader { handle String readFile(String path) { when (IOException joe) { // somehow access the FileInputStram and close it } } } 上記の概念言語では、クラスのreadFileが例外をスローしていないため、FileReader handlerがない場合、プログラムはコンパイルされません。そのため、ハンドラーを宣言することで、コンパイラーはハンドラーが処理され、プログラムがコンパイルされることを確認できます。FileReader FileReader このようにして、チェック済みおよび未チェックの例外問題の両方の長所、つまり堅牢性と可読性が得られます。

3
パラメーター化されたクエリへの依存は、SQLインジェクションから保護する唯一の方法ですか?
SQLインジェクション攻撃で私が見たすべては、パラメータ化されたクエリ、特にストアドプロシージャのクエリが、このような攻撃から保護する唯一の方法であることを示唆しているようです。私が(暗黒時代に)働いていたとき、主に保守性が低いと見られていたため、ストアドプロシージャは貧弱なプラクティスと見なされていました。テスト可能性が低い。高度な結合; システムを1つのベンダーにロックしました。(この質問は他のいくつかの理由をカバーしています)。 私が働いていたとき、プロジェクトはそのような攻撃の可能性にほとんど気づいていませんでした。さまざまな種類の破損からデータベースを保護するために、さまざまなルールが採用されました。これらのルールは次のように要約できます。 クライアント/アプリケーションは、データベーステーブルに直接アクセスできませんでした。 すべてのテーブルへのすべてのアクセスはビューを介して行われました(ベーステーブルへのすべての更新はトリガーを介して行われました)。 すべてのデータ項目にドメインが指定されていました。 データ項目をNULL可能にすることは許可されませんでした-これは、DBAが時々歯を磨くという意味がありました。しかし、強制されました。 ロールと権限が適切に設定されました-たとえば、ビューのみにデータを変更する権限を与える制限されたロール。 SQLインジェクション攻撃を防ぐために、このような(強制的な)ルールのセット(必ずしもこの特定のセットである必要はありませんが)は、パラメーター化されたクエリの適切な代替手段ですか?そうでない場合は、なぜですか?データベースは、データベース(のみ)固有の手段によって、このような攻撃から保護できますか? 編集 質問の強調は、受け取った最初の回答に照らして、わずかに変わりました。基本質問は変更されていません。 EDIT2 パラメータ化されたクエリに依存するアプローチは、システムに対する攻撃に対する防御の周辺ステップにすぎないようです。より根本的な防御が望ましいと思われ、特にインジェクション攻撃から防御する場合でも、そのようなクエリへの依存は不要であるか、それほど重要ではないようです。 私の質問に暗示されているアプローチは、データベースの「装甲」に基づいており、それが実行可能なオプションであるかどうかはわかりませんでした。さらなる研究は、そのようなアプローチがあることを示唆しています。このタイプのアプローチへのポインタを提供する以下のソースを見つけました。 http://database-programmer.blogspot.com http://thehelsinkideclaration.blogspot.com これらのソースから取得した主な機能は次のとおりです。 広範なセキュリティデータディクショナリと組み合わせた広範なデータディクショナリ データディクショナリからのトリガー、クエリ、および制約の生成 コードを最小化し、データを最大化する これまでの回答は非常に有用であり、パラメータ化されたクエリを無視することから生じる困難を指摘していますが、最終的には元の質問に回答しません(太字で強調されています)。

7
開発アプローチ:ユーザーインターフェイスインまたはドメインモデルアウト?
Smalltalkを使って何も配信したことはありませんが、Smalltalkで遊んだ短い時間は間違いなくその価値を残しました。エクスペリエンスを記述する唯一の方法は、本来の方法であるMVCです。基本的に、アプリケーションのすべての面倒な作業は、ビジネスオブジェクト(または、その傾向がある場合はドメインモデル)で行われます。標準コントロールは、何らかの方法でビジネスオブジェクトにバインドされます。たとえば、テキストボックスはオブジェクトのフィールドにマップされます(フィールド自体はオブジェクトなので、簡単に実行できます)。ボタンはメソッドにマップされます。これはすべて非常にシンプルで自然なAPIで行われます。オブジェクトのバインドなどについて考える必要はありません。それは機能します。 しかし、多くの新しい言語とAPIでは、外部から考えることを余儀なくされています。最初はC ++とMFCで、そして今はC#とWPFで、Microsoftはイベントハンドラーを実装してアプリケーションを構築するGUIビルダーに夢中になりました。Java Swingの開発もそれほど変わっていません。自分でフォームのコントロールをインスタンス化するコードを書いているのはあなただけです。一部のプロジェクトでは、ドメインモデルさえ存在しない場合があります-イベントハンドラーだけです。私はほとんどのキャリアのためにこのモデルの中とその周りにいました。 それぞれの方法で、あなたは違った考え方を強いられます。Smalltalkアプローチでは、GUIが愚かである間、ドメインはスマートです。デフォルトのVisualStudioアプローチでは、GUIはスマートですが、ドメインモデル(存在する場合)はかなり貧弱です。 私が仕事をしている多くの開発者は、Smalltalkアプローチに価値を見出し、そのアプローチをVisualStudio環境に押し付けようとします。WPFには、それを可能にするいくつかの動的バインディング機能があります。しかし、制限があります。ドメインモデルに属するコードの一部は、必然的にGUIクラスになります。 では、どのようにコードを設計/開発しますか?どうして? 最初にGUI。ユーザーとの対話が最も重要です。 最初にドメイン。UIを配置する前に、システムが正しいことを確認する必要があります。 どちらのアプローチにも長所と短所があります。ドメインモデルは、クリスタルの大聖堂と空のパイでそこに収まります。GUIは迅速かつ汚い(時には本当に汚い)状態で収まります。 さらにボーナスがあります:コードが保守可能であることをどのように確認しますか?

5
アランクーパーの統合ファイルモデルはどうなりましたか?
長い間、アラン・クーパー(彼の著書「About Face」の3つのバージョンで)は、とりわけ、彼がこれまでに発明した最もばかげたメッセージボックスと呼ばれるものを省くために「統一ファイルモデル」を推進してきました。アプリまたはフォームの[閉じる]ボタンを押すと、「変更を破棄しますか?」というポップアップが表示されます。私はこのアイデアと彼の議論が好きですが、ほとんどのベテランのプログラマーとユーザーが持っている、それに対するひねくれた反応もあります。 Cooperの本は非常に人気があり尊敬されているように見えますが、この特定の問題に関するWeb上の議論はほとんどありません。「Programming Industrial Strength Windows」の作者であるPetter Hesselbergがそれについて言及していますが、それについては思われます。 私は現在取り組んでいる(デスクトップ)プロジェクトでこれを実装する機会がありますが、MS WordとExcelの方法を熟知している顧客や同僚からの抵抗に直面しています。私は彼らの異議を無効にする立場にありますが、そうすべきかどうかはわかりません。 私の質問は: これについて、私が見つけられなかった良い議論はありますか?アプリでこれをしている人はいますか?残念ながら、Microsoftがやるまで実装するのは実用的ではないというのは良い考えですか?

4
「通知センター」パターンは、プログラム設計の良し悪しを促進しますか?
Cocoa NSNotificationCenterなど、これらのメッセージハブスタイルのAPIに出くわすことがあります。http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html 通常、これらのAPIは、メッセージ/イベントをサブスクライブまたはブロードキャストするグローバルアクセスポイントを提供します。これは、依存関係がAPIで明示されていないがソースコードに隠されているフラットで非構造化のプログラムアーキテクチャを促進するため、これが問題だと考えています。オブジェクトの所有権と階層について考える必要はありませんが、プログラム内の任意のオブジェクトを呼び出すことで、任意のコードを呼び出すことができます。しかし、これは良いことでしょうか? このパターンは一般に、プログラム設計の良し悪しを助長しますか?コードをテストするのが難しくなりますか、それとも簡単になりますか? この質問が曖昧すぎるか広すぎる場合はご容赦ください。私は、このようなAPIの広範な使用の潜在的な結果と、それを使用できるさまざまな方法について頭をかき回しています。 編集:このパターンの最大の問題は、APIが依存関係とオブジェクトカップリングについて「嘘をつく」ことであり、この例で説明できることです。 myObj = new Foo(); myOtherObj = new Bar(); print myOtherObj.someValue; // prints 0 myObj.doSomething(); print myOtherObj.someValue; // prints 1, unexpectedly, because I never indicated that these objects had anything to do with each other

4
データ値をプログラムにハードコーディングする利点はありますか?
私は独学で初心者っぽいコーダーなので、プログラマーの専門用語に釘付けにならなければ謝罪します。 私は、データのクエリからレポートを生成するツールを本質的に作成する開発者に継続的に更新されるデータを提供するプロジェクトに取り組んでいます。 関係者全員が、データ値(スキーマではなく、ドメイン/値自体)をレポート生成プログラムにハードコーディングする必要があると考えているようです。 たとえば、人員について報告しているとします。レポートは各部門の見出しを持つカテゴリに分割され、各部門の見出しの下に役職の小見出しが表示され、各小見出しの下に従業員のリストが表示されます。開発者は、部門と役職をハードコーディングしたいと考えています。一方、実行時にそれらをクエリし、レコードでソートし、そこにある値に基づいてレポートヘッダーを動的に生成できると思います。 潜在的な値のリストは時間とともに変化するため(たとえば、部門の作成/名前の変更、新しい役職の追加など)、コードを継続的に更新する必要があります。私は、コードのメンテナンス手順をスキップして、レポートを動的に整理できるように思えます。 私は開発者ではないので、何が欠けているのだろうと思っています。このようなツールに値をハードコーディングするとどのような利点がありますか?これは通常、プログラムの設計方法ですか?


6
人間が読める最も単純な構成ファイル形式は何ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 現在の構成ファイルは次のとおりです。 mainwindow.title = 'test' mainwindow.position.x = 100 mainwindow.position.y = 200 mainwindow.button.label = 'apply' mainwindow.button.size.x = 100 mainwindow.button.size.y = 30 logger.datarate = 100 logger.enable = True logger.filename = './test.log' これは、Pythonを使用してネストされた辞書に読み込まれます。 { 'mainwindow':{ 'button':{ 'label': {'value':'apply'}, ... }, 'logger':{ datarate: {'value': 100}, enable: {'value': True}, filename: {'value': './test.log'} }, …

1
文法に基づいてレクサーを作成するときに従う手順は何ですか?
文法、レクサー、パーサーに関する質問Clarificationに対する回答を読んでいると、答えは次のように述べています。 [...] BNF文法には、字句解析と構文解析に必要なすべてのルールが含まれています。 パーサーは文法に基づいているのに対し、これまでは常に字句解析は文法に基づいていないと考えていたため、これはやや奇妙に思えました。レクサーの作成に関する多数のブログ投稿を読んだ後、この結論に至りました。デザインの基礎として1つのEBNF / BNF を使用したことはありません。 パーサーと同様にレクサーがEBNF / BNF文法に基づいている場合、そのメソッドを使用してレクサーを作成するにはどうすればよいでしょうか?つまり、特定のEBNF / BNF文法を使用してレクサーを構築するにはどうすればよいですか? EBNF / BNFをガイドまたは設計図として使用してパーサーを記述することを扱った多くの投稿を見てきましたが、レクサーデザインと同等のことを示すものは今のところ見つかりませんでした。 たとえば、次の文法を取ります。 input = digit| string ; digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; string = '"', { all characters - …

5
円に最も近い最適なものを見つける
以下は、真ん中に白い点のポイントがあり、すべての赤い円がすでに存在する場合に青い円(明らかにそれを配置した場所にある)に最も近い場所を見つけたい場合の画像例です。 。その場所を見つけるにはどうすればよいですか? 私にとってパフォーマンスは、このアプリケーションにとって大きな関心事ではありません。

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