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

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

6
プログラミングの方法と、プログラミングの方法を学ぶ方法は知っていますが、システムを適切に作成する方法と場所はどこで学びますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 システムを作成する際に考慮しなければならないことがたくさんあります。たとえば、ユーザーがログインして相互作用し、コンテンツを作成および編集するWebベースのシステムを考えてみましょう。今、私はセキュリティ、バリデーション(私はそれが何を伴うのかを100%確信しているとさえ思わない)、「ユーザーがお互いの足を踏まないことを確認する」(これを言う?)、多くのエラーを防ぐことを考えなければならない予期せぬ状況でデータベースデータが問題にならないようにしていますか?どのように、どこで学ぶべきかわからないこれらすべてのことについて、この種のものに関する本はありますか?私が言ったように、コードを書くことと実際に正しいコードを書くことの間には大きな違いがあるように思えます。私の現在のプログラミング作業は、私が説明したものの多くを欠いているように感じ、後でそれが引き起こす問題を見ることができます。そして、データが存在し、人々がそれを使用しているため、問題を解決するのははるかに困難です。だから誰も私にこのタイプの学習のための本やリソース、またはプログラミングの適切なサブセット(?)を教えてもらえますか? PS:自由にタグを修正してください。何を言っているのかわかりません。 編集:私が書いた例のいくつかは他のタイプのシステムにも当てはまると思います。私は主にウェブの仕事に携わっているので、他の良い例は知りません。

5
オープンクローズド原則の利点を活用していますか?
Open-Closed Principle(OCP)は、オブジェクトは拡張のために開かれ、修正のために閉じられるべきであると述べています。私はそれを理解し、SRPと組み合わせて使用​​して、たった1つのことを行うクラスを作成すると信じています。そして、すべての動作コントロールをサブクラスで拡張またはオーバーライドできるメソッドに抽出できるようにする多くの小さなメソッドを作成しようとしています。したがって、依存関係の注入と構成、イベント、委任など、多くの拡張ポイントを持つクラスになります。 次の単純で拡張可能なクラスを考えてください。 class PaycheckCalculator { // ... protected decimal GetOvertimeFactor() { return 2.0M; } } たとえば、OvertimeFactor1.5に変更するとします。上記のクラスは拡張するように設計されているため、簡単にサブクラス化して別のを返すことができますOvertimeFactor。 しかし ... ...クラスは拡張用に設計され、OCPに準拠していますが、問題のメソッドをサブクラス化およびオーバーライドしてからIoCコンテナー内のオブジェクトを再配線するのではなく、問題のメソッドを変更します。 その結果、OCPが達成しようとしていることの一部に違反しました。上記の方法は少し簡単なので、怠けているように感じます。OCPを誤解していますか?私は本当に何か違うことをするべきですか?OCPのメリットをさまざまに活用していますか? 更新:回答に基づいて、この人為的な例は、いくつかの異なる理由で貧弱な例のように見えます。この例の主な目的は、オーバーライドされると、内部コードまたはプライベートコードを変更せずにパブリックメソッドの動作を変更するメソッドを提供することにより、クラスが拡張されるように設計されたことを示すことでした。それでも、私は間違いなくOCPを誤解していました。

2
繰り返しコードを整理する方法は?
私のチームは、1回限りのWebフォームをたくさん作成しています。これらのフォームのほとんどは、単に電子メールを送信するだけであり、いくつかは単純なデータベース書き込みを行います。 現在、各フォームはVisual Studio Team Foundation Serverの独自の個別のソリューションに存在しています。つまり、約100の異なるフォームプロジェクトがあるため、一貫性を維持することが難しくなります。各フォームはフィールドが異なるという点でユニークですが、それらはすべてほぼ同じことを行います。 私はこれらを何らかの形で凝縮したいと考えており、実際にいくつかのガイダンスを使用することができます。 すべてのフォームプロジェクトを含む1つのソリューションファイルを作成する必要がありますか?配管コードはそれほど多くありませんが、電子メールのフォーマットなどを支援するヘルパークラスをいくつか作成できます。プロジェクト間でCSS、JavaScript、コントロール、画像を共有できると非常に便利です。 私たちがマイクロソフトのショップであることを考えると、この特定のシナリオでMVCのようなものをWebformsに移行することで具体的なメリットはありますか?私は全体としてMVCの概念で販売されていますが、そのフォームがすべて電子メールを送信する場合、15フィールドのデータ収集フォームをより効率的にまとめるのに役立ちますか?これについて考えさせられたフォームには、ユーザーの応答に基づいてフィールドを表示および非表示にするためのロジックが組み込まれており、MVCとjQueryを使用するのは効率的ではなかったようです。

1
適切な問題ステートメントの作成
<裏話> 先日、古本屋でコードコンプリートという本を買ってきて、すごい本だと聞いて読み始めました。約10ページ後、私が取り組んでいる最近のプロジェクトについて、私はちょっと愚かであることに気付きました。ここで少し説明しておきますが、私は仕事に就いていません。これは学校向けではありません。それは可能な限り非公式です(たまにSOで質問したことがありますが、私もそれに取り組んでいる唯一の人です)。私は中学生で、ソフトウェアを作成しようとしています。 簡単に言えば、私はすぐにコーディングに飛びつきました(そして今、彼がそのコードがどのように機能するかについてその場で行ったいくつかの決定に疑問を投げかけています)。だから私は正しい方法からやり直そうとしている。 </バックストーリー> わかりました、それで私は問題文を作成しようとしています、そして私は私に良いものがあるかどうかを知るためにいくつかの良いヒントが何であるかを知りたいと思いました。コードコンプリートは、それは技術的ではなく、ユーザーの観点からすべきだと述べましたが、私は試みました。それを改善する上でのアドバイスはありがたいです。 私の知る限り、現在、デコヒーレンス、エラー訂正、エンタングルメント、古典的なコンピューターのアルゴリズムなどの機能を含む、大規模で複雑な量子コンピューティング回路をシミュレートする良い方法はありません。既知で簡単にアクセスできます。 本当にひどい場合は申し訳ありませんが、これはこれが初めてです。 編集-下書き2: コメントと回答の提案を使って書き直しました。 量子コンピューティングの分野の理論家、研究者、学生が、アプリケーション自体のコードを作成せずに、複雑で大きな量子回路を直感的かつ効率的な方法でシミュレーションおよびテストする方法はありません。量子アルゴリズム、エラー修正コード、エンタングルメント、デコヒーレンス、および理想的で現実的なインターフェースのその他の側面の結果に関する結果を正確に生成できるシンプルなインターフェースを備えた一般的なブラウザーで機能するWebアプリケーションは、専門家と学生の両方が彼らのアイデアをテストし、量子コンピューティングの分野をよりよく理解してください。

2
MVVMでは、ViewModelまたはViewが新しいビューの作成を担当する必要がありますか?
私のWPFアプリケーションで、新しいビューを作成します。ViewModelまたはModelのどこでそれを行うべきですか? アプリケーションは(今のところ非常にシンプルです)、1つの「送信」ボタンを備えた1ウィンドウフォームのようなツールです。チェックボックスの1つが選択されている場合、同じViewModelを使用する新しいウィンドウがポップアップし、追加の詳細をユーザーに尋ねます。この質問の目的のために、表示/非表示のパネルなどの別のアプローチを考慮せずに、新しいウィンドウのアプローチのみを検討してみましょう。 理想的には、Viewにはコードがないはずです。さらに、Viewにはロジックが含まれていないため、VMは最初に新しいビューの作成が必要かどうかを確認する必要があり、必要な場合はこの責任をViewに戻して、コードの膨張につながります。 一方、ViewModelで新しいビューを作成すると、ViewModelがViewについて何も認識してはならないという原則に違反します。 では、ViewまたはViewModelで新しいビューを作成する方が良いでしょうか?
11 c#  design  wpf  mvvm 

5
RealNumberおよびComplexNumber継承を実装する方法は?
うまくいけば、あまりにも学術的ではありません... SWライブラリに実数と複素数が必要だとしましょう。 is-a(またはhere)関係に基づいて、実数は複素数であり、複素数の虚数部のbは単に0です。 一方、私の実装は、その子は親を拡張するため、親のRealNumberには実数部があり、子ComplexNumberには架空のアートが追加されます。 また、相続は悪だという意見もあります。 昨日のように、私が大学でOOPを学んでいたとき、私の教授は、これらの2つの絶対値が異なる方法で計算されるため、これは継承の良い例ではないことを思い出します(ただし、そのためにメソッドのオーバーロード/ポリモーフィズムがありますよね?)。 。 私の経験では、継承を使用してDRYを解決することがよくあります。その結果、階層に人工的な抽象クラスが含まれることがよくあります(実際のオブジェクトを表さないため、名前を見つけるのに問題があることがよくあります)。

3
いつ入力をトリミングする必要がありますか?
私はインターンとして、学界以外の業界についてたくさん学びます。 今日私が考えたのは、入力のトリミングです。 コインの片側では、入力にスペースが多すぎるためにユーザー/実装者が予期しない結果を常に受け​​取ることを望まないため、すべての関数呼び出しの後にユーザー入力を常にトリミングする必要があります。 しかし、同時に、ここで社内で使用するAPIライブラリを作成している場合、結果の主要な空白が末尾/先頭にあることが重要になる可能性があります。 次に、空白が重要かどうかがわからない場合があります。 私にとっての大きな問題は、コード内のどこにいても.trim()が常に呼び出されていることです。 誰もが特定の状況を処理する方法についてのヒント/経験則または単なる考えを持っていますか?

6
SRPを実装する実際的な方法は何ですか?
クラスが単一責任の原則に違反しているかどうかを確認するために人々が使用する実用的なテクニックは何ですか? クラスには変更する理由が1つだけあるべきだと知っていますが、その文は実際にそれを実装する実用的な方法に少し欠けています。 私が見つけた唯一の方法は、「それは…………それ自体……」という文を使うことです。ここで、最初のスペースはクラス名で、後はメソッド(責任)名です。 ただし、責任が本当にSRPに違反しているかどうかを判断するのが難しい場合があります。 SRPを確認する方法は他にありますか? 注意: 問題は、SRPの意味ではなく、SRPを確認して実装するための実際的な方法論または一連の手順です。 更新 SRPに明らかに違反するサンプルクラスを追加しました。単一の責任の原則にどのように取り組むかを説明するための例として、人々がそれを使用できれば素晴らしいと思います。 例はここからです。

3
AndroidのContentProviderが作成されたのはなぜですか?
タイトルは私の質問を要約していますが、基本的に理解したいのは、AndroidデザイナーがSQLiteデータベースに直接アクセスするのではなく、共有データを操作してコンテンツプロバイダーを使用する必要があるアプリが必要な理由です。 私が考えることができる唯一の理由は、特定のファイルが特定のプロセスにしかアクセスできないため、コンテンツプロバイダーがデータベースファイルへの読み取りおよび/または書き込みアクセスを許可する前に各アプリに適切な権限を与えることを保証するゲートキーパーであるため、セキュリティです。それがContentProviderが作成された主な理由ですか?
11 design  android 

6
プログラミングに特化したノートブックはありますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、専門知識によって裏付けられると期待していますが、この質問は、議論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 6年前休業。 エンジニアリングペーパーが存在することは知っていますが、ノート/疑似コード/デザイン用のプログラマー固有のノートブックを作成している会社はありますか? 紙は私が物事を概説するのに好ましい方法なので、ツールのリストに専用のパッドを追加することは非常に有益です。

6
メンバーを非表示にすることのみを目的として明示的なインターフェイス実装を使用する理由は何ですか?
C#の複雑さを研究しているときに、明示的なインターフェイスの実装に関する興味深い一節に出会いました。 While this syntax is quite helpful when you need to resolve name clashes, you can use explicit interface implementation simply to hide more "advanced" members from the object level. の使用を許可するobject.method()か、キャストを要求するかの違いは((Interface)object).method()、経験の浅い目には意地悪な難読化のようです。テキストでは、これによりオブジェクトレベルでIntellisenseからメソッドが非表示になることが示されていますが、名前の競合を回避する必要がないのに、なぜそうする必要があるのでしょうか。
11 c#  design  interfaces 

3
ウィザードを使用したWebページのREST API設計
ウィザード形式のWebページがあります。APIへの送信ボタンは、ウィザードの4番目のステップにあります。ただし、ウィザードの次のステップに進む前に、入力したデータをデータベースに保存しておく必要があります。また、REST APIが単一のタブを持つページで機能するようにしたいと考えています。 そこで、クエリパラメータaction = draftまたはsubmitを実行するようにAPIを設計しました。アクションがドラフトの場合、特定のフィールドのみが必須です。アクションが送信の場合、すべてのフィールドが必須です。REST APIのサービスレイヤーでの検証は、クエリパラメーターに基づいて行われます。ドキュメントでif / else句を明示的に指定する必要があるようです。これはRESTfulな設計の受け入れ可能な形式ですか?これらの要件に最適な設計は何ですか?
11 design  rest 

4
関数を呼び出すこの方法は悪い習慣ですか?
私は次のコードを持っています: public void moveCameraTo(Location location){ moveCameraTo(location.getLatitude(), location.getLongitude()); } public void moveCameraTo(double latitude, double longitude){ LatLng latLng = new LatLng(latitude, longitude); moveCameraTo(latLng); } public void moveCameraTo(LatLng latLng){ GoogleMap googleMap = getGoogleMap(); cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, INITIAL_MAP_ZOOM_LEVEL); googleMap.moveCamera(cameraUpdate); } このようにすると、LatLngたとえば、別のクラスの内容を知る責任がなくなると思います。 また、関数を呼び出す前にデータを準備する必要はありません。 どう思いますか? このアプローチには名前がありますか?それは本当に悪い習慣ですか?

4
「時期尚早の抽象化」とは何ですか?
私はフレーズが乱れているのを聞いたし、私には議論が完全に正気ではないように聞こえます(ここでわざわざ言っているとすみません、それは私の意図ではありません)。 一般的なケースがわかる前に抽象化を作成したくない場合は、(1)属していないものを抽象化に入れるか、(2)重要なものを省略します。 (1)私にはこれはプログラマーが十分に実用的ではないように聞こえます、彼らは最終的なプログラムには存在しないものがあると仮定しているので、抽象化のレベルが低い状態で作業していますが、問題はありません時期尚早な抽象化、それは時期尚早な結着です。 (2)重要なことの省略は1つです。後で重要になることが仕様から省略されている可能性があります。これに対する解決策は、独自の結論を導き出してリソースを無駄にすることではありません。間違っていると思います、それはクライアントからより多くの情報を取得することです。 これは、抽象化から具体化に至るまで常に作業する必要があります。これは、最も実用的な方法であり、その逆ではないためです。 そうしないと、クライアントを誤解し、変更が必要なものを作成するリスクがありますが、クライアントが独自の言語で定義した抽象化のみを構築する場合は、このリスクにぶつかることはありません(少なくとも、いくつかの具体的な暗闇の中でのショット)、はい、クライアントは詳細について考えを変える可能性がありますが、本来彼らが望むものを伝えるために使用していた抽象化は依然として有効である傾向があります。 以下に例を示します。クライアントがアイテムバギングロボットの作成を希望しているとします。 public abstract class BaggingRobot() { private Collection<Item> items; public abstract void bag(Item item); } 私たちは、クライアントが使用した抽象化から何かを構築していますが、わからないことについては詳しく説明していません。これは非常に柔軟性があり、「時期尚早な抽象化」と呼ばれるのを見てきましたが、実際にはバギングがどのように実装されたかを想定するのは時期尚早です。複数のアイテムを一度にバギングすることをクライアントと話し合った後、 。クラスを更新するために必要なのはシグネチャを変更することだけですが、ボトムアップを始めた人にとっては、大規模なシステムのオーバーホールが必要になる可能性があります。 時期尚早な抽象化などはなく、時期尚早な結集だけです。このステートメントの何が問題になっていますか?私の推論のどこに欠陥がありますか?ありがとう。

2
警告システムのアーキテクチャ
さまざまなプログラムからのアラートメッセージを処理し、それらのアラートを処理して電子メールを介してダウンコンシューマーに送信できるシステムを作成したいと考えています。これはすべて1つの内部ネットワークに含まれます。 基本的なアーキテクチャを次のようにしたいと思います。 私の現在の主な関心事は「メッセージハンドラー」ビットです。これが私の「ソートAPI」になります。このシステムのすべてのコンポーネントが、データベースへのすべての書き込みを処理するAPIにデータを送信するようにします。このアプローチは、セキュリティを簡素化し、より複雑なDBクエリの多くを1つのプログラムに含めることができるため、より簡単だと思います。 懸念事項は、これを言語にとらわれないようにしたいことです。つまり、どのコードでもメッセージをハンドラに送信して、メッセージを解釈できるようにする必要があります。これは、JSONフラットファイルを介して、またはプログラムへのREST呼び出しを介して(下流のアプリケーションに柔軟性を与える)希望します。 私の質問は メッセージハンドラーを気にする必要がありますか?それとも、下流のアプリケーションと他の2つのコンポーネント(管理コンソールとアラートマネージャー)への直接データベースアクセスを許可するだけで簡単になりますか? このようにして、DBテーブルへのINSERTが有効である限り、任意のアラートを挿入できます。 私は貿易でソフトウェアデザイナーではないので、失礼します。ただ、自由な時間にプロジェクトをやってもらいたいのです。

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