タグ付けされた質問 「object-oriented」

システムを、モジュール方式で制御および操作できるオブジェクトのセットとしてモデル化できるようにする方法論


5
多くの小さなクラスと論理的な(しかし)複雑な継承
優れたOOPデザイン、クリーンなコード、柔軟性、将来のコードのにおいを避けるという点で、何が優れているのだろうかと思っています。イメージの状況。クラスとして表す必要がある非常によく似たオブジェクトがたくさんあります。これらのクラスには特定の機能はなく、データクラスだけで、名前(およびコンテキスト)だけが異なります。例: Class A { String name; string description; } Class B { String name; String count; String description; } Class C { String name; String count; String description; String imageUrl; } Class D { String name; String count; } Class E { String name; String count; String imageUrl; String age; …

5
アプリケーション設定を読み込む最良の方法
Javaアプリケーションの設定を保持する簡単な方法は、特定の値(この値は数字、文字列、日付など)に関連付けられた各設定の識別子を含む「.properties」拡張子を持つテキストファイルで表されます。 。C#は同様のアプローチを使用しますが、テキストファイルには「App.config」という名前を付ける必要があります。どちらの場合も、ソースコードでは、設定を読み取るために特定のクラスを初期化する必要があります。このクラスには、指定された設定識別子に関連付けられた値を(文字列として)返すメソッドがあります。 // Java example Properties config = new Properties(); config.load(...); String valueStr = config.getProperty("listening-port"); // ... // C# example NameValueCollection setting = ConfigurationManager.AppSettings; string valueStr = setting["listening-port"]; // ... どちらの場合も、構成ファイルから読み込まれた文字列を解析し、変換された値を関連する型付きオブジェクトに割り当てる必要があります(この段階で解析エラーが発生する可能性があります)。解析ステップの後、設定値が特定の有効領域に属していることを確認する必要があります。たとえば、キュ​​ーの最大サイズは正の値である必要があり、いくつかの値は関連している場合があります(例:min <max )、 等々。 アプリケーションが起動するとすぐに設定をロードする必要があると仮定します。つまり、アプリケーションによって実行される最初の操作は設定をロードすることです。設定の無効な値は、自動的にデフォルト値に置き換えられる必要があります:これが関連する設定のグループに発生した場合、それらの設定はすべてデフォルト値で設定されます。 これらの操作を実行する最も簡単な方法は、最初にすべての設定を解析し、次に読み込まれた値をチェックし、最後にデフォルト値を設定するメソッドを作成することです。ただし、このアプローチを使用する場合、メンテナンスは困難です。アプリケーションの開発中に設定の数が増えると、コードの更新がますます難しくなります。 この問題を解決するために、次のようにTemplate Methodパターンを使用することを考えていました。 public abstract class Setting { protected abstract bool TryParseValues(); protected abstract bool …

7
1つのことだけを行うクラスのパターン
のは、私が手続き持っていると言うものを行うに: void doStuff(initalParams) { ... } 今、私は「何かをする」ことは非常に複雑な操作であることを発見しました。手順は大きくなり、複数の小さな手順に分割し、すぐに何かを行うときに何らかの状態を持つことが有用であることに気付きました。したがって、私はそれを独自のクラスに分解します: class StuffDoer { private someInternalState; public Start(initalParams) { ... } // some private helper procedures here ... } そして、私はこれを次のように呼び出します: new StuffDoer().Start(initialParams); またはこのように: new StuffDoer(initialParams).Start(); そして、これが間違っていると感じるものです。.NETまたはJava APIを使用するとき、私は常にを決して呼び出さないためnew SomeApiClass().Start(...);、間違っていると思われます。確かに、StuffDoerのコンストラクターをプライベートにし、静的ヘルパーメソッドを追加できます。 public static DoStuff(initalParams) { new StuffDoer().Start(initialParams); } しかし、その場合、外部インターフェイスが1つの静的メソッドのみで構成されるクラスがあり、これも奇妙に感じます。 したがって、私の質問:このタイプのクラスには定評のあるパターンがありますか? エントリポイントが1つしかない 「外部的に認識可能な」状態がありません。つまり、インスタンス状態はその1つのエントリポイントの実行中にのみ必要です。

2
ビルダーが独自のクラスファイルではなく内部クラスである必要があるのはなぜですか?
多くのBuilder Pattern例では、Builderビルドするオブジェクトの内部クラスを作成しています。 これは、Builderビルドの内容を示すため、ある程度意味があります。ただし、静的に型付けされた言語では、Builderビルドの内容がわかります。 一方、Builderが内部クラスである場合、の内部を見ずにビルドするクラスを知る必要BuilderがありBuilderます。 また、ビルダーを内部クラスとして使用すると、外部クラスから参照できるため、インポートの数が減ります(気になる場合)。 そして、がBuilder同じパッケージ内にあるが、のような内部クラスではない実用的な例がありStringBuilderます。あなたはそれがそう名付けられているので、構築するBuilder 必要があることを知っていStringます。 そうは言ってもBuilder、内部クラスを作成する理由として考えられる唯一の正当な理由は、クラスのBuilder名前を知らず、命名規則に依存せずにクラスが何であるかを知っているということです。たとえば、もし私がStringBuilder内部クラスだったStringとしたら、おそらく私がそれよりも早く存在したことを知っていただろう(投機的) Builder内なるクラスにする他の理由はありますか、それとも単に好みと儀式に帰着しますか?

6
このアーキテクチャでOOPプラクティスを破っていますか?
Webアプリケーションがあります。テクノロジーが重要だとは思わない。構造は、左の画像に示されているN層アプリケーションです。3つの層があります。 UI(MVCパターン)、ビジネスロジックレイヤー(BLL)およびデータアクセスレイヤー(DAL) 私が抱えている問題は、ロジックとアプリケーションイベントコールを介したパスがあるため、BLLが非常に大きいことです。 アプリケーションの一般的なフローは次のとおりです。 UIで発生したイベントは、BLLのメソッドにトラバースし、ロジック(おそらくBLLの複数の部分で)を実行し、最終的にDALに戻り、BLLに戻り(さらにロジックが高い場合)、UIに値を返します。 この例のBLLは非常に忙しいため、これを分割する方法を考えています。また、ロジックとオブジェクトが組み合わされており、それらは好きではありません。 右側のバージョンは私の努力です。 ロジックは依然としてアプリケーションがUIとDALの間を流れる方法ですが、おそらくプロパティはありません...メソッドのみ(このレイヤーのクラスの大部分は、状態を格納しないため、静的である可能性があります)。Pocoレイヤーは、プロパティ(名前、年齢、身長などが存在するPersonクラスなど)を持つクラスが存在する場所です。これらはアプリケーションのフローとは関係なく、状態のみを保存します。 フローは次のとおりです。 UIからトリガーされ、UIレイヤーコントローラー(MVC)にデータを渡します。これにより、生データが変換され、pocoモデルに変換されます。その後、pocoモデルはLogicレイヤー(BLL)に渡され、最終的には途中で操作される可能性のあるコマンドクエリレイヤーに渡されます。コマンドクエリレイヤーは、POCOをデータベースオブジェクトに変換します(ほぼ同じものですが、1つは永続化用に設計され、もう1つはフロントエンド用に設計されています)。アイテムが保存され、データベースオブジェクトがコマンドクエリレイヤーに返されます。その後、POCOに変換され、そこでロジックレイヤーに戻り、さらに処理され、最後にUIに戻される可能性があります 共有ロジックとインターフェイスは、MaxNumberOf_XやTotalAllowed_Xなどの永続データとすべてのインターフェイスを保持する場所です。 共有ロジック/インターフェイスとDALの両方が、アーキテクチャの「ベース」です。これらは外の世界について何も知りません。 共有ロジック/インターフェースとDAL以外のすべてがpocoについて知っています。 フローはまだ最初の例と非常によく似ていますが、各レイヤーが1つのこと(状態、フロー、その他)に責任を負います...しかし、このアプローチでOOPを壊していますか? LogicとPocoをデモする例は次のとおりです。 public class LogicClass { private ICommandQueryObject cmdQuery; public PocoA Method1(PocoB pocoB) { return cmdQuery.Save(pocoB); } /*This has no state objects, only ways to communicate with other layers such as the cmdQuery. Everything else is just …

6
クラスが独自のパブリックメソッドを使用しても大丈夫ですか?
バックグラウンド 現在、デバイスが送信および受信するオブジェクトを持っている状況があります。このメッセージには、次のようないくつかの構成要素があります。 public void ReverseData() public void ScheduleTransmission() ScheduleTransmissionこの方法は、必要呼び出すためにReverseData、それが呼ばれるたびにメソッドを。ただし、アプリケーションでオブジェクトがインスタンス化されている場所からReverseData外部で呼び出す必要がある場合があります(名前空間の外側に完全に追加する必要があります)。 「受信」に関してはReverseData、object_receivedイベントハンドラーで外部から呼び出されて、データを元に戻します。 質問 オブジェクトが独自のパブリックメソッドを呼び出すことは一般に許容されますか?

4
多くのアヒル型動的プログラミング言語が、プロトタイプベースのOOPではなくクラスベースのアプローチを使用するのはなぜですか?
非常に多くの動的プログラミング言語にはダックタイピングの機能があり、クラスやインスタンスのメソッドをいつでも開いて変更できるため(RubyやPythonなど)、... 質問1)動的言語のクラスの必要性は何ですか?プロトタイプ言語ではなくオブジェクトを使用するのではなく、クラスを何らかの「テンプレート」として使用するように言語が設計されているのはなぜですか? また、JavaScriptはプロトタイプベースですが、CoffeeScript(JavaScriptの拡張バージョン)はクラスベースの方法を選択します。また、Lua(プロトタイプベース)とMoonScript(クラスベース)でも同じです。さらに、ES 6にはクラスがあります。 質問2)特にプロトタイプベースの言語を改善しようとする場合、クラスベースに変更する必要があることを示唆していますか?そうでない場合、なぜそのように設計されているのですか?

2
DDD集計のシリアル化のベストプラクティス
DDDによると、ドメインロジックは、シリアル化、オブジェクトリレーショナルマッピングなどの技術的な問題で汚染されるべきではありません。 それでは、ゲッターとセッターを介して公開することなく、集計の状態をどのようにシリアル化またはマッピングしますか?リポジトリの実装など、多くの例を見てきましたが、実際にはすべて、マッピングのエンティティと値オブジェクトのパブリックアクセサーに依存していました。 リフレクションを使用してパブリックアクセサーを回避することもできますが、これらのドメインオブジェクトはIMOで暗黙的にシリアル化の問題に依存します。たとえば、シリアル化/マッピングの設定を調整しないと、プライベートフィールドの名前を変更したり削除したりできませんでした。そのため、代わりにドメインロジックに焦点を当てる必要があるシリアル化を検討する必要があります。 ここで従うべき最良の妥協点は何ですか?パブリックアクセサーと一緒に住んでいますが、マッピングコード以外には使用しないでください。または、明らかな何かを見逃しただけですか? 私は、DDDドメインオブジェクト(エンティティと値オブジェクトで構成される集約)の状態をシリアル化することに明確に興味があります。これは、一般的なシリアル化や、ステートレスサービスが単純なデータコンテナオブジェクトで動作するトランザクションスクリプトシナリオではありません。

12
オブジェクト指向設計
次のものがあるとします: +--------+ +------+ | Animal | | Food | +-+------+ +----+-+ ^ ^ | | | | +------+ +-------+ | Deer | | Grass | +------+ +-------+ Deerから継承しAnimal、からGrass継承しFoodます。 ここまでは順調ですね。Animalオブジェクトはオブジェクトを食べることができFoodます。 それでは少し混ぜましょう。Lionを継承するを追加しましょうAnimal。 +--------+ +------+ | Animal | | Food | +-+-----++ +----+-+ ^ ^ ^ | | | | | | +------+ …

6
UMLクラス図はJavaScriptシステムの設計に適していますか?
UMLがオブジェクト指向へのより古典的なアプローチを指向していることを考えると、JavaScriptシステムを設計するための信頼できる方法でまだ使用可能ですか? 私が見ることができる特定の問題の1つは、実際にはクラス図がシステムの構造図であり、JavaScriptがより多くの動作駆動型であるということです。どうすれば対処できますか? ここでは、現実世界のドメインについては話していないことに注意してください。私が達成しようとしているソリューションのモデルです。

6
関数で動詞を使用し、クラスで名詞を使用する-インターフェイスはどうですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 OK、動詞を関数で、名詞をクラスで使用する通常の規則を理解しています。インターフェイスはどうですか?インターフェイス名を思い付くときに、それほど明白ではないかもしれない方法論はありますか? 明確にするために、名前の前に「I」を付けるか、またはcamelCaseまたはPascalCaseを使用するかについては話していません。インターフェイスの明確で意味のある名前を見つける方法について疑問に思っています。 編集 最も明確な方法でインターフェイスに名前を付ける方法に夢中です。クラスの命名について考えるとき、クラスに関連付けることができる最も近い「実際の」世界オブジェクトを考えるので、それも名詞である必要があると思います。現実世界のインターフェイスは、キーボード、マウス、リモートコントロール、ATM画面のようなものだと思います。それらはすべて名詞です。とにかく、インターフェース名を定式化する良い方法に関する追加の洞察はありがたいです。

5
オブジェクト指向プログラミングのパラダイムは、反モジュラーおよび反並列であるため、時代遅れですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 CMUの教授であるRobert Harperが投稿した論争の的となっている記事Teaching FPを新入生に読みました。彼は、CMUが「最新のCSカリキュラムには適さない」ため、入門コースでオブジェクト指向プログラミングを教えることはもはやないと主張しました。 そして彼はそれを主張した: オブジェクト指向プログラミングは、その性質上、反モジュラーかつ反平行であるため、導入カリキュラムから完全に排除されます。 OOPを反モジュラーおよび反並列と見なす理由

5
純粋に機能的な言語はモジュール性をどのように処理しますか?
私は、オブジェクト指向のバックグラウンドから来ました。そこでは、クラスを使用して、少なくともオブジェクトを作成するために使用するか、継承で使用できるコードの簡単なリサイクルを可能にする抽象化層を作成することができます。 たとえば、動物のクラスを持つことができ、そこから猫と犬を継承し、すべてが同じ特性を多く継承し、それらのサブクラスから動物の品種または名前を指定できるオブジェクトを作成できますそれの。 または、クラスを使用して、わずかに異なるものを処理または含む同じコードの複数のインスタンスを指定できます。検索ツリーまたは複数の異なるデータベース接続のノードとそうでないもの。 私は最近関数型プログラミングに移行しているので、私は疑問に思い始めて いました。つまり、クラスとオブジェクトの概念のない言語です。

6
科学ソフトウェアの継続的統合
私はソフトウェアエンジニアではありません。私は地球科学の分野で博士課程の学生です。 ほぼ2年前、科学ソフトウェアのプログラミングを開始しました。継続的インテグレーション(CI)を使用したことはありません。主に、最初はそれが存在することを知らず、このソフトウェアに取り組んでいるのは私だけだったからです。 現在、ソフトウェアのベースが実行されているため、他の人がそれに興味を持ち始め、ソフトウェアに貢献したいと考えています。計画では、他の大学の他の人がコアソフトウェアへの追加を実装しています。(バグが発生する可能性があります)。さらに、ソフトウェアは非常に複雑になり、テストがますます難しくなりました。また、作業を継続する予定です。 この2つの理由により、私はCIの使用についてますます考えています。私はソフトウェアエンジニアの教育を受けたことがなく、CIについて聞いたことがありません(私たちは科学者であり、プログラマーではありません)。 私はいくつかのアドバイスを得たい質問がいくつかあります: まず、ソフトウェアの動作の簡単な説明: ソフトウェアは、必要なすべての設定を含む1つの.xmlファイルによって制御されます。入力引数として.xmlファイルへのパスを渡すだけでソフトウェアを起動すると、実行され、結果を含むいくつかのファイルが作成されます。1回の実行に最大30秒かかります。 科学的なソフトウェアです。ほとんどすべての関数には複数の入力パラメーターがあり、そのタイプはほとんどが非常に複雑なクラスです。これらのクラスのインスタンスを作成するために使用される大きなカタログを持つ複数の.txtファイルがあります。 では、私の質問に行きましょう。 ユニットテスト、統合テスト、エンドツーエンドテスト?:私のソフトウェアは現在、約30.000行のコードで、数百の関数と〜80クラスです。すでに実装されている数百の関数の単体テストの作成を開始するのは、ちょっと奇妙に感じます。だから私は単にいくつかのテストケースを作成することを考えました。10〜20個の異なる.xmlファイルを準備し、ソフトウェアを実行します。これがエンドツーエンドテストと呼ばれるものだと思いますか?私は頻繁にこれを行うべきではないことを読みましたが、すでに動作するソフトウェアをお持ちの場合、それはスタートとして大丈夫ですか?または、すでに動作しているソフトウェアにCIを追加しようとするのは、単純な馬鹿げたアイデアでしょうか。 関数パラメーターを作成するのが難しい場合、単体テストをどのように作成しますか? 私は機能を持っていると仮定double fun(vector<Class_A> a, vector<Class_B>)し、通常、私はタイプのオブジェクトを作成するために複数のテキストファイル内の最初の読み取りに必要があるだろうClass_AとしClass_B。Class_A create_dummy_object()テキストファイルを読み取らずにダミー関数を作成することを考えました。また、何らかのシリアル化の実装についても考えました。(クラスオブジェクトは複数のテキストファイルにのみ依存するため、クラスオブジェクトの作成をテストする予定はありません) 結果が大きく変動する場合のテストの書き方 私のソフトウェアは、大きなモンテカルロシミュレーションを利用し、繰り返し動作します。通常、1000回の反復があり、反復ごとに、モンテカルロシミュレーションに基づいてオブジェクトのインスタンスを500〜20.000個作成しています。1つの反復の1つの結果のみが少し異なる場合、今後の反復全体が完全に異なります。この状況にどのように対処しますか?最終結果は非常に変動するので、これはエンドツーエンドのテストに対する大きなポイントだと思いますか? CIに関するその他のアドバイスは大歓迎です。

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