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

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

5
ネストされたクラスは過小評価されていますか?
私は他の誰もが知らないことを知っていると言っているわけではありませんが、ネストされたクラスを使用してますます多くのデザインを解決してきました。設計メカニズム。 これは私に質問を導きます:彼らが私を噛むように戻ってきたときに私が発見する理由のために、私は本質的に悪い道を進んでいますか、またはネストされたクラスはおそらく過小評価されているものですか? 次に、私がそれらを使用した2つの例を示します。https://gist.github.com/3975581-1つ目は、密接に関連する階層的なものを一緒に保つのに役立ち、2つ目は、保護されたメンバーへのアクセス権をワーカーに与えました...
9 c#  design 

4
迅速なプロトタイピングとリファクタリング
小さなプロジェクト(Androidアプリなど)を開始するとき、最後にどのアプローチがうまくいくかわからないことがあるので、1つのアプローチを試してみます。しかし、このアプローチをこれまでに使用したことがない場合(ある種のアプリケーションの場合、これまでプログラムしたことがない)、それは未知の地形に足を踏み入れるようなものです。使用するライブラリがわからない(たぶん、いくつかのライブラリを試す必要があるかもしれません)非常に多くの認識されていない(例:Androidで生のオーディオデータを取得する方法) したがって、私の開発プロセスは次のようになります。 コードを記述して、アプローチにチャンスがあるかどうかを確認します。(アプローチが不確実であるほど、コードはより醜くなります) 機能する場合は、綺麗になるまでたくさんリファクタリングしてください この時点でソフトウェア設計を詳細に計画した場合、それは時間の無駄になると思います。それは、地図のない旅行を計画するようなものです。 これはアグリー開発の一部ですか?ソフトウェア開発で未知の地形にどのように対処しますか?

4
疑似コーディングによるソフトウェア設計?
疑似コードに基づく方法でソフトウェアを設計する(つまり、書き留める)良い方法を知っていますか? 私はソフトウェア設計に不慣れで、UMLに関する情報を読んでいます。私の控えめなクラス階層はこれまでのところ良好ですが、複雑になったら、「全体を見る」ことで、将来の拡張性のために別の構造を使用できることに気付きました。Pythonはプロトタイピングに適しているので、書き始めたばかりで大丈夫ですが、まったくそうではありません。 そこで、UMLクラス図を試しましたが、あまり役に立たないようです。そこで解決する問題は、頭の中でささいなことです。しかし、実際のメソッドの疑似コード化を開始すると、追加の設計要件に気づきます。 では、疑似コードで設計したい場合、どうすればよいでしょうか?私にとっては、コードとほぼ1対1の方法が最も効果的だと思います。しかし、ほとんどのUMLソフトウェアはメソッドのコードさえ表示しません(たとえば、GoFの画像とは対照的です)。 誰かがUMLはドキュメンテーションとプレゼンテーションのためだけのものであり、デザインのためにはそれほど優れていないと主張しましたか?私もその感覚を得ます。Envision APDTが見つかるまで、純粋なUMLといくつかの単純化したホワイトボードスケッチがソフトウェアを設計する方法であると思いました。 それで、アジャイル開発は私が注意すべきものですか、それともランダムにそのアジャイルと呼びますか-アジャイルはスケジュールのみに関するものだと思いましたか?または、私は(UMLを使用して)間違って設計していますか-誰かが疑似コードで設計していますか?どうすればそのための優れたツールを見つけることができますか?
9 agile  uml  design 

7
プロのソフトウェア開発チームは、重要なプロジェクトの複雑な設計にどのように対処しますか?
まず、私はこの質問が多少長く漠然としていることを理解しており、お詫び申し上げます。これはおそらく、「理解した」人にとっては短い名前の基本的な問題ですが、私はこの点について欠けていると思うので、問題を説明する際はご容赦ください。 私は11歳の頃から、この方法でプログラミングを行ってきました。これは、私が最初から自分にすべてを教えていたことを意味します。私は技術教育を受けましたが、厳密にはコンピュータサイエンスではありませんでした(私はフォトニックエンジニアリングの学位を取得して卒業しています)。もちろんプログラミングコースもありましたが、これは私にとっては基本的なもので、新しいことはあまり学びませんでした。私はその喜びのために自分自身を教育し続けており、プログラミングのキャリアを追求することを常に知っていましたが、その当時の私のプロジェクトはすべて非常に小規模でした。私はそれらを私の心に留め、維持するのに問題はありませんでした。 現在、私はチームでリードしていますが、企業環境ではありません-私は大学でエンジニアリングアプリケーション用の科学ソフトウェア(C ++)を開発しています。突然、プロジェクトは(比較的)大きくなり、ほとんどの場合、私はそれを心に抱くことができなくなりました。主に次の2つのことに多くの時間と労力を費やしています。 しばらく作業していなかったコードのセクションに戻る必要がある場合、それがどのように機能したかを思い出すことが困難です。私は、関連するクラスのヘッダーファイルを確認し、途中でソースファイルに配置したコメントを読むのに多くの時間を費やしています。私が垣間見ることができ、より簡単に画像を取り戻すことができる何らかの「回路図」があるといいのですが。 変更を導入するとき、私がやろうとしていることが他の場所で何かを壊してしまうことの中間点に気付くことがあります(さらに悪いことに、それは実行時にのみ驚きとして現れます)。私は元に戻して別の方法で始めましたが、他のコンポーネントへの影響を無視したことがわかりました。何かが行われる方法、他のコンポーネントに影響を与える方法、変更を実装する前に詳細に計画する方法を確認できる「アーキテクチャダイアグラム」があったらいいのにと思います。 私が一緒に仕事をする人のほとんどは私と同じようなストーリーを持っています-強力な技術的志向と時には素晴らしいスキルですが、彼らの仕事を整理する方法がありません。しかし、彼らのプロジェクトは通常私のプロジェクトよりもはるかに小さいので、彼らはどういうわけか対処します。とにかく、それが私にとって何を意味するかというと、私は一人でいるので、良い実践を学ぶ人がいないということです。 ITの管理に関する大学院のコースを受講しましたが、ITの管理は非常に満足できるものであると感じましたが、主に非プログラマーを対象としており、プロジェクト管理の方法論、予算/スケジュールの見積もり、エンタープライズアーキテクチャなどについて説明しており、ソフトウェアの設計や計画などは担当していません。それは大丈夫です、私もそのことを学ぼうとしています。もちろん、いくつかのツール(UMLなど)とソフトウェア開発プロセスのタイプ(カスケード、反復、アジャイル...)が導入されましたが、明らかにそれほど詳細ではなく、何を選択して使用するかを決めるのに苦労しました(とどの程度)。 私はSOのソフトウェア設計について多くの質問と回答を読んでいます-これまたはその特定のツールまたは方法論を使用してそれを行うことについては多くあります。UMLのドキュメントが私の問題を解決すると確信している場合-私はそれをピックアップし、それを使い始める。しかし、それを誓う人もいれば、役に立たないと言う人もいます。抽象化のより高いレベルでの答えを探しています-私が抱えている2つの問題を解決する方法はありますか。おそらく1つの特定のツールに縛られることなく、それを実行できるようにするには何を学ばなければなりませんか?これらは時々流行から脱却し、プロジェクトの種類によって適用性が異なると思います。 読んでくれてありがとう、私はもっと簡潔に言うことができませんでした(ソフトウェア設計の経験と語彙が不足しています)。

5
OOP:クラスベースのデザインがインターフェイスベースのデザインよりも優れている状況にはどのようなものがありますか?
JDOMのウェブサイトを読んでいました 。 JDOM APIがインターフェイスではなく具象クラスで定義されているのはなぜですか? Jason Hunterは、JDOMのインターフェースベースのAPIに対する引数を要約しています。 インターフェースではすべてがファクトリーになり、要素を追加するだけでなく新しいドキュメントに「インポート」する必要があり、長期的なシリアル化などの機能は保証されず、リストは続きます。 実際にインターフェースから始めました。いくつかの同僚へのリリース前のレビュー中に、具体的なクラスを試すべきフィードバックを受け取りました。私たちはそうしました、そしてデザインはそれのためにはるかに優れていました。 私は初心者デザイナーです。私が今までについて聞いたことがすべてのアドバイスをさに対して助言具象クラスを使用した設計を使用しました。 特定の場所で適切なクラスを使用している場合があります。デザインで具象クラスを使用しても問題ない、一般的なクラスの問題はありますか?

6
ファイルを解析する最良の方法
EDIFACTやTRADACOMSなどの有名なファイル形式をパーサーで作成するためのより良い解決策を見つけようとしています。 これらの標準に慣れていない場合は、Wikipediaからこの例を確認してください。 製品の在庫状況のリクエストに回答するために使用されるEDIFACTメッセージの例については、以下を参照してください。 UNA:+.? ' UNB+IATB:1+6XPPC+LHPPC+940101:0950+1' UNH+1+PAORES:93:1:IA' MSG+1:45' IFT+3+XYZCOMPANY AVAILABILITY' ERC+A7V:1:AMD' IFT+3+NO MORE FLIGHTS' ODI' TVL+240493:1000::1220+FRA+JFK+DL+400+C' PDI++C:3+Y::3+F::1' APD+714C:0:::6++++++6X' TVL+240493:1740::2030+JFK+MIA+DL+081+C' PDI++C:4' APD+EM2:0:130::6+++++++DA' UNT+13+1' UNZ+1+1' UNAセグメントはオプションです。存在する場合は、メッセージの残りの部分を解釈するために使用される特殊文字を指定します。この順序でUNAに続く6文字があります。 コンポーネントデータ要素セパレータ(:このサンプルでは) データ要素セパレータ(このサンプルでは+) 10進数の通知(このサンプルでは。) リリースキャラクター(このサンプルでは?) 予約済み、スペースでなければならない セグメントターミネーター(このサンプルでは ') ご覧のとおり、解析されるのを待機している特別な方法でフォーマットされたデータの一部です(XMLファイルのように)。 現在、私のシステムはPHPで構築されており、セグメントごとに正規表現を使用してパーサーを作成できましたが、問題は誰もが標準を完全に実装しているわけではないということです。 一部のサプライヤーは、オプションのセグメントとフィールドを完全に無視する傾向があります。他の人は他より多くのデータを送信することを選択するかもしれません。そのため、ファイルが正しいかどうかをテストするために、セグメントとフィールドのバリデーターを作成する必要がありました。 私が今持っている正規表現の悪夢を想像できます。さらに、各サプライヤーは、各サプライヤーのパーサーを作成する傾向がある正規表現に多くの変更を加える必要があります。 質問: 1-これは(正規表現を使用して)ファイルを解析するためのベストプラクティスですか? 2-ファイルを解析するためのより良いソリューションはありますか(おそらくそこに既製のソリューションがあるでしょう)?どのセグメントが欠落しているか、またはファイルが破損しているかを表示できますか? 3-とにかくパーサーを構築する必要がある場合、どの設計パターンまたは方法論を使用する必要がありますか? ノート: yaccとANTLRについてどこかで読みましたが、私のニーズに合っているかどうかはわかりません。

4
GUIプログラミングの信号+スロットモデルの実用的な代替手段はありますか?
今日のGUIツールキットの大部分は、Signals + Slotsモデルを使用しています。それを開拓したのは、QtとGTK +でした。 ご存知のように、ウィジェットまたはグラフィカルオブジェクト(場合によっては表示されないものも)がメインループハンドラーに信号を送信します。次に、メインループハンドラーは、そのウィジェット/グラフィカルオブジェクトに割り当てられたイベント、コールバック、またはスロットを呼び出します。通常、virtualすべての事前定義された信号を処理するために、ツールキットによってすでに提供されているデフォルト(およびほとんどの場合)のイベントハンドラーがあります。そのため、開発者がすべてのメッセージに対してメインループ全体とハンドラー全体を記述する必要がありました。 (WINAPIを考えてください)、開発者は新機能を実装するために必要な信号についてのみ心配する必要があります。 現在、私が知る限り、このデザインはほとんどの最新のツールキットで使用されています。Qt、GTK +、FLTKなどがあります。JavaSwingがあります。C#には言語機能(イベントとデリゲート)さえあり、Windowsフォームはこの設計で開発されました。実際、過去10年間で、このGUIプログラミングの設計は、一種の未記述の標準になりました。それは生産性を高め、より優れた抽象化を提供するためです。 しかし、私の質問は: 現代のGUIプログラミングにとって並列または実用的な代替設計はありますか? つまり、Signals + Slotsデザインは、町で唯一の実用的なデザインですか?他のデザインでGUIプログラミングを実行することは可能ですか?代替設計に基づいて構築された最新の(できれば成功し、人気のある)GUIツールキットはありますか?

4
パブリックメソッドからハッシュテーブルを返す際の何が問題になっていますか?
クラスを作成してそのオブジェクトを返すのではなく、複数のアイテムを返したいときに、パブリックメソッドからハッシュテーブルを返す際の設計上の問題は何ですか? 問題がある場合は、どのような状況でそれを行うのが理にかなっていますか? 言語が動的かどうかによって、この質問に対する答えはどのように変わりますか? 編集:これは、キーが定数であり、データではなくコードの一部であることを明確にするためです。通常、クラスを作成するためのもの。問題は、クラスの作成が実際に正しい選択であるように思われる場合に、代わりにハッシュテーブルを使用することが間違っている理由です。

1
これは悪いデザインですか?どうすれば改善できますか?
しばらく前に書いていたのですが、最近レビューしに来て、デザインが良くないと思います。 設計は、Entity Framework 4を使用する一種のモジュラーデータベースレイヤー用です。指定された場所にある外部ライブラリからエンティティフレームワークコンテキストを(レイジーに)読み込む単一のデータベースオブジェクトがあり、読み込まれたコンテキストのインスタンスは、ハッシュテーブルに格納されます。それらの名前(EG "ContentMgmtContext")。 このシステムのデータベースとの接触はすべて、ストアドプロシージャを介して行われます。データベースを呼び出すために、クエリメソッドシグネチャは次のようになります。 List<TReturn> Query<TReturn>(string Context, string Procedure, TransactionScope Scope, List<ObjectParameter> QueryParameters) このモジュール性は私が好きなものです。ただし、このアプローチには重大な欠点が1つwhen using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through …
9 design 

8
ソフトウェアが肥大化する原因は何ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前休業。 今日、私はCreative Sound Blasterドライバーのクリーンインストールを実行することを決定しました。そのため、クリーンアップ手順全体を実行する必要がありました。そして、それは私にほぼ2時間かかった。 そして正直なところ、理由がわかりません!?そして、クリエイティブであるIMHOは、決して機能しない低品質のソフトウェアを生産する絶対的な1位ですが、肥大化の問題はそれらに限定されません。 キヤノンのデジタルカメラドライバーを搭載したPCには、あらゆる種類の接続と相互接続された約10のキヤノンエントリがあります。Visual Studioも主要な例です。フルインストールのエントリは約50ほどあります。その修復は、完全な操作でのみ可能です。そして、VS2k8からVS2k8SP1などにアップグレードするときに、OSのインストール全体を台無しにしてしまうことさえありました。結局のところ、5GBの空き容量は300Mbパッチには不十分でした... したがって、これは本当に広範囲にわたる問題のようです。最近のほとんどすべてのアプリケーションには、通常、アンパッカー、複数のスパイウェアのような「友達」がインストールされており、ドライバーは通常、プリンターなどを含むすべてのものに対して約600Mbです。 しかし、なぜ?開発者のせいですか?このようなアプリケーションはサポートが悪夢であり、現在100%機能することはありません。私が知っているほとんどすべてのユーザーは、USBサムドライブ/プリンター/カメラ/サウンドカード/ブラウザーの必須ドライバーインストールとして得られるすべての膨張について非常に否定的です。 NullsoftのNSISが、Firefoxのインストールなど、私が知っていることから肥大化していない唯一のクリーンなセットアップシステムのようです。クリーンで、ほとんど問題なくxcopyベースのインストール。 それでは、なぜ人々は30層を超える相互接続に根ざしていない単純なセットアップとアプリケーションを使用していないのでしょうか。開発者が怠けているからでしょうか?codegenツールの使用?企業がユーザーが気に入るような重いアプリを強制しているからでしょうか?原因は何ですか?ソフトウェアがいつか基本に戻ることを期待していますか?新しいアプリケーションを最初から開始するときに膨張を回避するための手順は何ですか?

3
Gitはどのように設計されましたか?
私の職場は最近Gitに切り替わり、私はそれを愛しています(そして嫌いです!)。私は本当にそれを愛し、それは非常に強力です。私が嫌う唯一の部分は、時々それがあまりに強力であるということです(そして多分少し簡潔で混乱しています)。 私の質問は... Gitはどのように設計されましたか?短時間で使用するだけで、他のバージョン管理システムでは処理できなかった多くのあいまいなワークフローを処理できるという感じがします。しかし、それはまた、下にあるエレガントな感じです。そして速い! これは、Linusの才能に一部疑いの余地はありません。しかし、私は疑問に思っています、gitの全体的なデザインは何かに基づいていますか?BitKeeperについて読みましたが、アカウントは技術的な詳細が不十分です。圧縮、グラフ、リビジョン番号の削除、分岐、隠蔽、リモートの強調...それはどこから来たのですか? ライナスは本当にこれを公園から追い出して、ほとんど最初の試みで!学習曲線を過ぎてから使用すると非常に便利です。

8
新しい機能を処理するためのデータベースのリファクタリングまたはアップグレード
データベーススキーマの質問に対するいくつかの回答は、現在の要件の一部ではない機能のデータベースを正規化するための追加のテーブルを提案しました(UserDepartmentテーブルは、従業員/ユーザーとそれらが異なる部門との多対多の関係を可能にします属します。) 正規化に反対ではありません。データベースの設計に関しては、誰かが将来的に望んでいると確信している機能を含めるように強く求められているようです。テーブル/フィールドをデータベースに追加して機能に対応することは、過度に設計する傾向があるので難しいですか?必要に応じて、他のアプリと同じようにリファクタリングまたはアップグレードされませんか?やり直しは決して楽しいものではありませんが、データをあるテーブルから新しいテーブルに移動することはできます。この考え方がどこで終わるのかわからない。 編集:これには多くの嫌悪感があります。データベースの大幅な変更を必要とする機能を追加しないプロジェクトや、新しいテーブルの代わりにDepartmentID2フィールドを追加するなどの非正規化されたアプローチがいくつあるのでしょうか?従業員が複数の部署を必要とすることは、よくあるドメインの問題です。多対多の関係で散らかされている多くのデータベーススキーマに気づかなかっただけです。

9
開発方法は開発者の個人主義を押しつぶすべきか?
私は大学の最終学期にいて、ソフトウェアエンジニアリングのコースを受講しています。クラスでは、さまざまなソフトウェア開発方法について学びます。私たちが重点を置き、プロジェクトの開発に使用したのは、ウォーターフォール法でした。 インストラクターが間違って実装したようです。クラス図では、プライベートプロパティを含むすべてのプロパティとメソッドをリストする必要がありました。私はいくつかの本、つまりClean Codeを読みましたが、これは関数を可能な限り短くし、焦点を絞っていると述べています。他の開発者の助けにならない場合、ダイアグラムにすべての小さな関数をリストするのは面倒です(それらは非公開で、他の誰も使用しません)。さらに、プログラムを設計するときにすべての小さな関数について考えることはないかもしれません。リファクタリングするときにそれらが一緒に来るかもしれません。 インストラクターは、すべての機能をリストするように依頼して、私たちに間違ったことを伝えましたか?そして、これらの設計方法は、開発者の個人主義を押しつぶして、コードを最もよく理解できるようにコードを記述しますか?

11
完璧な範囲リテラルの設計
言語を設計する場合、「完全な」範囲リテラルを設計する方法を考えていました。1〜4のように、値の範囲を表すステートメント内の範囲リテラルがわからない場合。それらはfor / foreachループで最も一般的に使用されます 考慮すべきいくつかの問題があるようです 包括的および排他的範囲のサポート、エンドポイントへの+1または-1の付加は、少しあいまいでエラーが発生しやすいようです。 ステッピングのサポート。たとえば、偶数または奇数の範囲を作成できます。 読みやすさ、範囲リテラルが何を説明しているかはすぐにわかるはずです あいまいさはありません。範囲リテラルが何を表すかは完全に明確でなければなりません デフォルトはおそらく包括的から排他的であるべきです。それは、配列のループなどでほとんどの場合に使用されるものだからです。 とにかく、私が見た範囲リテラルの1つの例は、Rubyです。これは、排他的な(最後の)範囲の場合は1..3、包括的(最後の)の場合は1 ... 3の形式です。1..10.step(5)を実行することもできます。慎重に検討した結果、そのアプローチについて私が気に入らない点がいくつか見つかりました(ルビに関する私の限られた知識から) あなたは終わりのために包括的で排他的にのみ記述することができます。ほとんどのシナリオを説明していますが、少し矛盾しているように見えます。 追加だけで変化します。範囲が包括的であるか排他的であるかをわかりにくくするためのレシピのようです。私はあなたのことは知りませんが、ドットはぼやけたものになる傾向があります:) 範囲の表記法のようなメソッドを追加すると、リテラルの概念とクラスの概念が混ざったように見えます(クラスがクラスにコンパイルされた場合でも) とにかく、別の選択肢を考えた後。これを思いついた [5..1] 5、4、3、2、1 [1..5 [ 1,2,3,4 ] 1..5] 2、3、4、5 [ 0..5..20] 0、5、10、15、20 など。私はそれが好きです。なぜなら、セットとは対照的にこれが注文されるとしても、通常はセットをデノネートし、これはちょっとそれに適合するからです。 私が少し引きずっているのは、排他的/包括的インジケーターを必須にするかどうかです。つまり、1..5とだけ書いた場合、配列の最も一般的なケースであるため、デフォルトは1,2,3,4になります。 。簡単で読みやすくなりますが、具体性は低く、[1..5 []と書かなければならない場合は、それらがどのように機能するかについて早期に学びます。 それで、あなたはどう思いますか、私はほとんどの拠点をカバーしました、何か見落としましたか?[]を必須にしますか?プログラミング言語で範囲リテラルを別の方法で設計しますか? 候補者 ブラケットのスタイル:[0..10 [ 、ステップと: [0..5..20 [ 間隔表記:[0..10) ステップを有する:[0..5..20) 排他的な感嘆。0 ..!10、ステップあり:0..5 ..!20 別のステップで。0 ..!20、5 しかし、それはデフォルト*になるだろう0..10'包括的、包括的に 語句:[0から!20 by 5] 私はaestically私のお気に入りは、これまでであることを言わなければならない0 …

6
オブジェクト指向システムで、クラスではなく(Cスタイルの)構造体を選択するとしたら、どこを選択すればよいでしょうか。
Cおよび他の多くの言語では、struct構造(または同様の方法)を作成するためのキーワードが提供されています。これらは(少なくともCでは)クラスのような単純化された観点からですが、ポリモーフィズム、継承、メソッドなどはありません。 Cスタイルの構造体を持つオブジェクト指向(またはマルチパラダイム)言語を考えてみてください。クラスではなく、どこで選びますか?現在、クラスはOOPでそれらの目的を置き換えるように見えるので、それらがOOPで使用されるとは思われませんが、オブジェクト指向プログラムのクラスよりも優先される可能性のある状況や、どのような状況にあるのでしょうか。そのような状況はありますか?

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