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

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


1
Builderパターンとの互換性のない構成をどのように処理する必要がありますか?
これは、別の質問に対するこの回答が動機です。 ビルダーパターン)、特に、オプションの初期化パラメータとの複合体の初期化を簡略化するために使用されます。しかし、相互に排他的な構成を適切に管理する方法がわかりません。 ここにImageクラスがあります。 Imageファイルまたはサイズから初期化できますが、両方から初期化することはできません。コンストラクタを使用してこの相互排除を強制することは、クラスが十分に単純な場合に明らかです。 public class Image { public Image(Size size, Thing stuff, int range) { // ... initialize empty with size } public Image(string filename, Thing stuff, int range) { // ... initialize from file } } Imageビルダーパターンが役立つように実際に十分に構成可能であると想定すると、突然これが可能になる可能性があります。 Image image = new ImageBuilder() .setStuff(stuff) .setRange(range) .setSize(size) // <---------- NOT …

2
MVC:私のコントローラーは半分の時間、役に立たないようです。これは問題ですか?
多くの場合、MVCを使用してプログラムを設計すると、コントローラーが半分の時間無駄になります。 つまり、ビューで何かが発生します(ボタンのクリックなど)。次に、ビューはコントローラーに通知します。次に、コントローラーはモデルに直接委任し、何もする必要がないため、他に何もしません。 例えば: ユーザーはボタン「カラーブルー」を押します>ビューはコントローラーに通知しますcontroller.colorBlue()>コントローラーはモデルに通知しますmodel.colorBlue()>モデルの色が何か青いです。 この例では、コントローラーは役に立たないようです。それは何も追加しません。ビューはモデルに直接話しかけたかもしれません。 ただし、残りの半分の時間は、コントローラーがビューとモデルの間で何らかのメディエーションを行います。 私の質問はこれです:これはMVC構造でどのくらい一般的ですか?コントローラの半分の時間が不要であるように見えるのは理にかなっていますか?それともこれは問題ですか?これは一般的ですか?私はこれにどのように取り組むべきですか? 私の質問が十分に明確でない場合は、そのように言ってください。

4
$ _POST、$ _ GETなどはカプセル化の原則に違反していますか?
グローバルを使用すると、コードのテストが困難になり、バグが発生しやすくなり、安全で予測不可能になります。そのため、関数/オブジェクト内で必要な変数を渡します。だから私の質問は簡単です: $ _POST、$ _ GETなどはカプセル化の原則に違反していますか? これらの変数の制御をオブジェクト指向の方法で維持するには、理想的な解決策は次のような行をコードに追加することだと思います。 // Convert the $_GET array to an object $get = json_decode(json_encode($_GET), FALSE); // stackoverflow.com/a/1869147 // Stop it from being included from anywhere unset($_GET); // Small example of what could be done later on $DB = new PDO(/* ... */); $Person = new Person($DB, $get->id); …

1
オブジェクト指向コードを機能コードにリファクタリングするために使用できるいくつかのテクニックは何ですか?
JavaScriptとHTML5キャンバスを使用してゲームの一部を開発するのに約20〜40時間費やしました。私が始めたとき、私は何をしているのか全く分かりませんでした。したがって、これは概念実証として始まり、現在は順調に進んでいますが、自動テストはありません。ゲームは複雑になり始めており、自動化されたテストの恩恵を受けることができますが、コードがグローバル状態の変化に依存しているため、実行するのは難しいようです。 JavaScript用の関数型プログラミングライブラリであるUnderscore.jsを使用して、すべてをリファクタリングしたいと思います。私の一部は、関数型プログラミングスタイルとテストを使用して、ゼロから始めるべきだと思っています。しかし、命令型コードを宣言型コードにリファクタリングすることは、より優れた学習体験であり、現在の機能の状態に到達するためのより安全な方法になると思います。 問題は、コードを最終的にどのように見せたいかはわかっていますが、現在のコードをそれに変換する方法がわかりません。私はここの何人かの人々がリファクタリングの本とレガシーコードで効果的に働くことのいくつかのヒントを私に与えることを望んでいます。 たとえば、最初のステップとして、私はグローバルステートの「禁止」について考えています。グローバル変数を使用するすべての関数を取り、代わりにパラメーターとして渡します。 次のステップは、ミューテーションを「禁止」し、常に新しいオブジェクトを返すことです。 任意のアドバイスをいただければ幸いです。これまでにOOコードを取得して、Functionalコードにリファクタリングしたことがありません。

2
このクラスを開閉するのが難しい
これが私の問題です。ゲームパッド、よくレースする、ジョイスティックなど、さまざまなHIDデバイスからの入力を読みたいのですが、ほとんどすべてのゲームコントローラです。問題は、それらすべてに異なる入力があることです。 ゲームパッドにはボタン、スイッチ、スティックがあり、レースウェルにはギアスティックが付いている場合があります。これらのさまざまなコンポーネントをすべて3つに抽象化して、可能なすべての組み合わせを持つ基本クラスを作成するのではなく、 abstract class Device { public Buttons Buttons; public Axes Axes; public Switches Switches; public GearSticks GearSticks; //many more } 私は今持つことができます: abstract class Device { public Buttons Buttons; //on or off public Axes Axes; //range [-100%:100%] public Switches Switches; //multiple states } すべての入力を3種類に抽象化できるため、すべての具体的な実装を介して拡張に対して開かれている間、クラスを閉じたままにできるため、最初はこれに満足しました。 しかしその後、私は自分自身にかかわらず、私は避けられないが遅延していた場合にどのような?ある日Deviceクラスに別のフィールドを追加する必要がある場合はどうなりますか?トラックボールのようなものはサポートしていません! このクラスを将来証明できる方法はありますか?私がそれを見る方法では、私はこのようなものになるでしょう: public Device1 : Device …

2
MixinとTraitの違いは何ですか?
ScalaとHackからわかることから ミックスイン: 状態を持つことができます(つまり、インスタンスプロパティ) 具体的な方法しか提供できない クラスが混合されたのと同じ順序で呼び出されるコンストラクターを持つことができます もしA混合物中BとC、A instanceof B == falseそしてA instanceof C == false 特徴: メソッドのみを提供でき、状態は提供できません コンシューマが実装する必要がある抽象メソッドを宣言できます コンストラクタを持つことはできません AトレイトBとを実装する場合C、A instanceof B == falseおよびA instanceof C == false これは正しいですか、または何か不足していますか?これらの定義は、任意のOO言語に対して正確ですか、それとも上記の言語に対してのみ正確ですか?

4
イベントを使用した分離コンポーネント間の通信
相互に作用する小さな(> 50)小さなWebComponentsがたくさんあるWebアプリがあります。 すべてを切り離しておくために、原則として、どのコンポーネントも別のコンポーネントを直接参照できないようにしています。代わりに、コンポーネントはイベントを発生させ、(「メイン」アプリ内で)配線されて、別のコンポーネントのメソッドを呼び出します。 時間が経つにつれ、追加されるコンポーネントが増え、「メイン」のアプリファイルには次のようなコードチャンクが散らばっています。 buttonsToolbar.addEventListener('request-toggle-contact-form-modal', () => { contactForm.toggle() }) buttonsToolbar.addEventListener('request-toggle-bug-reporter-modal', () => { bugReporter.toggle() }) // ... etc これを改善するために、同様の機能をグループ化し、にClass関連性のある名前を付け、インスタンス化するときに参加要素を渡し、内の「配線」を次のClassように処理します。 class Contact { constructor(contactForm, bugReporter, buttonsToolbar) { this.contactForm = contactForm this.bugReporterForm = bugReporterForm this.buttonsToolbar = buttonsToolbar this.buttonsToolbar .addEventListener('request-toggle-contact-form-modal', () => { this.toggleContactForm() }) this.buttonsToolbar .addEventListener('request-toggle-bug-reporter-modal', () => { this.toggleBugReporterForm() }) …

4
非常に複雑なソフトウェアのコードベースを管理するにはどうすればよいですか?
私は、さまざまなオブジェクト指向プログラミング言語を使用して、自分自身と他の人のためのプログラムを作成することがよくあります。その場合、通常は比較的小さくなります(最大で数千行)。しかし最近、私は完全なゲームエンジンなど、より大きなプロジェクトを作成しようとしています。そうするとき、私はしばしば複雑さという障害にぶつかるように見えます。 私の小さなプロジェクトでは、プログラムのすべての部分がどのように機能するかについてのメンタルマップを覚えることは簡単です。これにより、変更がプログラムの残りの部分にどのように影響するかを十分に認識し、バグを非常に効果的に回避できるだけでなく、新機能がコードベースにどのように適合するかを正確に確認できます。しかし、より大きなプロジェクトを作成しようとすると、非常に面倒なコードと多数の意図しないバグにつながる、優れたメンタルマップを維持することが不可能であることがわかりました。 この「メンタルマップ」の問題に加えて、自分のコードを他の部分から切り離しておくことは難しいと思います。たとえば、マルチプレーヤーゲームにプレーヤーの動きの物理を処理するクラスとネットワークを処理するクラスがある場合、これらのクラスの1つが他のクラスに依存してプレーヤーの動きのデータをネットワークシステムに取得する方法はありませんネットワーク経由で送信します。このカップリングは、優れたメンタルマップを妨げる複雑さの重要な原因です。 最後に、他のクラスを調整する1つ以上の「マネージャー」クラスを考え出すことがよくあります。たとえば、ゲームでは、クラスがメインのティックループを処理し、ネットワーククラスとプレーヤークラスの更新メソッドを呼び出します。これは、各クラスは他とは独立して単体テスト可能で使用可能でなければならないという私の研究での発見の哲学に反しています。そのようなマネージャークラスは、その目的によってプロジェクトの他のほとんどのクラスに依存しているためです。さらに、プログラムの残りのマネージャークラスオーケストレーションは、メンタルマッピング不可能な複雑さの重要な原因です。 まとめると、これにより、かなりのサイズの高品質のバグのないソフトウェアを作成できなくなります。この問題を効果的に処理するために、プロの開発者は何をしますか?私は特にJavaとC ++のOOP回答ターゲットに興味がありますが、この種のアドバイスはおそらく非常に一般的です。 ノート: 私はUMLダイアグラムを使用してみましたが、それは最初の問題に役立つようであり、それでも(たとえば)最初に初期化されるものに関するメソッド呼び出しの順序付けではなく、クラス構造に関する場合に限られます。

6
物理的な小道具を使用して、非プログラマーにオブジェクト指向の原則を実演する[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 3年前休業。 私たちは、他の部門の人々がITスタッフからコーディングする方法を学ぶことができる私のコーディングで、新しいコーディングブートキャンプの支援に着手しようとしています。これは素晴らしいことですが、私は漬物になっています。継承、ポリモーフィズム、has-a、is-aの概念を物理的なデモと物理的に実証する方法を考え出すように依頼されました。事実上、彼らは私にプロップを使用してこれらの概念をプログラミングとコンピュータサイエンスについて何も知らない人々に示すように求めています! これらの原則を実証するために使用または見た良い類似点またはデモンストレーションはありますか?

4
メンバー関数がクラスプロパティ/メンバー変数を使用しない場合、OOP原則に違反しますか?
私は、ファイルを開いたり、読んだり、書き込んだりできる相互作用する既存のクラスを持っています。そのためにファイルの変更を取得する必要があります新しいメソッドを追加する必要があります これが私のクラス定義で、新しいメソッドを追加したいとします。 class IO_file { std::string m_file_name; public: IO(); IO(std::string file_name); + time_t get_mtime(file_name); + OR + time_t get_mtime(); }; 2つのオプションがあります- 空のオブジェクトを作成してから、ファイルの変更時刻を取得するメソッドの引数にfile_nameを渡します。 オブジェクト構築時にファイル名を渡し、単純にメンバー変数を操作するメンバー関数を呼び出します。 どちらのオプションも目的を果たします。また、2番目のアプローチは最初のアプローチよりも優れていると思います。しかし、私が理解していないのはどのようにですか?メンバー変数を利用しないので、最初のアプローチは悪いデザインですか?オブジェクト指向設計のどの原則に違反しますか?メンバー関数がメンバー変数を使用しない場合、そのメンバー関数は常に静的にする必要がありますか?

3
OOP設計の問題。2種類の空のオプション
ホテルの部屋の予約を扱う非常にシンプルなアプリケーションを書いています。ある段階で問題が発生しました。 注文のキューを処理しています。注文ごとに、受付係の1人は、クライアントの戦略に従って部屋(1つまたはまったくなし)を選択する必要があります。それが私がJavaを使うことにした理由Optionalです。問題は、希望する日に空き部屋がない場合は注文をキャンセルする必要があることですが、利用可能な部屋があり、それらのどれもが受付の戦略に適合しない場合は、注文をキューに戻す必要があります。 部屋を選択することは間違いなく受付の義務である必要があります。その問題にクリーンな方法で対処するための最良の方法は何だと思いますか?Optional日付に部屋がない場合、空を返す代わりに例外をスローする必要がありますか?残念ながら、例外は通常、コードフローを制御するための適切なソリューションではありません。 コードフラグメント: Optional<Room> selectedRoom = receptionist.chooseRoom(rooms, order.getQuestionnaire()); boolean decision = selectedRoom .map(room -> receptionist.askClient(order.getClient(), room, order.getQuestionnaire())) .orElse(false); if (shouldProcessAgain(order, selectedRoom.isPresent(), decision)) { orders.add(order); }

3
すべてのオブジェクトは自分自身を表示/描画する方法を知っている必要がありますか?
David Westは、著書Object Thinking(第10章、セクション1、サブセクション2)で、理想的なOO環境では、すべてのオブジェクトが要求に応じて自分自身を表示できる必要があると提案しました。人間向け(GUIとして)、非ネイティブコンポーネント(JSONやXMLとして)、またはその他の関係者向け: オブジェクト思考は、ビュー(インターフェイスとも呼ばれます)は、グラフィックまたはその他の方法で、オブジェクトが別のオブジェクトと通信するための手段であり、それ以上のものではないと言います。ビューの必要性は、オブジェクトが他のオブジェクト(通常は人間)またはアプリケーション(たとえば、プラットフォーム間で共有されているデータオブジェクトのXMLビュー)に対して「非ネイティブ」形式で表示される必要がある場合に発生します。 ビューが満たす必要のあるニーズとパラメーターの発見は、オブジェクトが参加するシナリオで明らかになります。オブジェクトがそれ自体を表示するように要求されるときは常に、その表示メッセージの送信者に適したビュー(表現)を使用する必要があります。たとえば、オブジェクトがそれ自体をインスタンス化しようとしている(それ自体の値を取得している)場合、そのオブジェクトのビューを、人間(または他のサービス提供オブジェクト)に暗黙の要求として値を提示する必要があります。ソフトウェアオブジェクトと人間のオブジェクトの間の仲介役として機能するGUIを構築する場合は、表示用にグリフを使用し、対話用にウィジェットを使用します。 しかし、どのグリフとウィジェットをGUIに含める必要がありますか?アプリケーションの実行中に当面のシナリオのシナリオを完了するために必要なもののみ。この視点は、アプリケーションからGUIを定義することを示唆しているため、ほとんどの開発者にとって直観に反しています。 例として、醸造所を考えてみましょう。片側にはビールが入ったバットがあります。ボトルウォッシャー、フィラーステーション、キャッピングマシン、パッケージアセンブラーで構成される複雑な生産ライン。その上にあるのは、醸造所を監視し、人間の管理者にステータスと問題を通知するコントロールステーションです。従来の開発者は、コントロールパネルの観点から「醸造所管理システム」の分析と設計を開始する可能性があります。これは、インターフェースからの設計に似ています。 オブジェクト思考は、代わりに、どのオブジェクトが醸造所とそのすべての無数の機械の主要な顧客であるかを検討することを示唆します。誰のために、機器の複雑な迷路が存在しますか?ビジネスの正解は、もちろん「お客様」です。しかし、オブジェクトの考え方をより反映した答えは、「ビール」です。すべてのシナリオは、ビールの観点から書かれており、キャップを付けて、ボトルに入れられ、パッケージに入れられ、トラックに常駐しています。コントロールパネルは、醸造所の状態の受動的な観察者5です。ある時点でビールに問題が発生した場合、介入サービスを要求するメッセージをコントロールパネル(またはマシン固有のコントロールパネル)に送信することにより、オペレーターの介入を要求するのはビールの責任です。 このパースペクティブは、GUI設計を簡素化し、さらに重要なことに、コントロールパネル(GUI)のパースペクティブから設計するときに必然的に発生すると思われるマネージャーおよびコントローラーオブジェクトのホストを排除します。 オブジェクト指向の世界の初心者から来る:これは本当にそうでしょうか? 自分自身を表現する方法を知っているオブジェクトがあれば、ウェストが彼の本で繰り返し言ったコントローラー/マネージャーオブジェクトの数を減らすことができます。しかし、この「ルール」を守らないとSRPが破られますか? また、(それが事実であることが判明した場合)、たとえばAndroidアプリケーションでの典型的な実装を考えると、どうすればこの種の目標を達成できるでしょうか?私たちが作成するすべてのオブジェクトは、それ自体をとして提示する方法を知っている必要がありViewますか?

2
ファイルからのオブジェクトの読み取り、SRPの違反?
C ++で物理シミュレーションプログラムを書いています。私はOOPとC ++の初心者です。 私のプログラムでは、入力ファイルのデータに基づいていくつかのオブジェクトを初期化する必要があります。 たとえば、架空の入力ファイル: # Wind turbine input file: number_of_blades = 2 hub_height = 120 # Airfoil data: airfoil1 = { chord = 2, shape = naca0012} airfoil2 = { chord = 3, shape = naca0016} この例では、TurbineクラスとAirfoilクラスがあるとします。翼オブジェクトは翼弦と形状を知る必要があり、タービンオブジェクトは翼の高さと数を知る必要があります。 各オブジェクトが入力ファイルから自分自身を構築できるように、これを行う必要がありますか? 例えば: class Turbine { public: Turbine(File input_file); // reads input file …

5
メソッドを静的にすると、多くのインスタンスを持つクラスのメモリを節約できますか?
アーロノートの質問への回答に応じて: すべての静的メソッドを使用することはできませんか? 静的メソッドに使用されるメモリは少なくありませんか?各オブジェクトインスタンスは、非静的メンバー関数の独自の実行可能バージョンを持ち歩いているように見えます。 OOの設計が不十分であっても、静的メソッドの呼び出しにどのくらいのオーバーヘッドが関係していても、将来の頭痛の種であっても、実行時に使用するメモリが少なくないのではないでしょうか。 次に例を示します。 ゼロで初期化されたオブジェクトのベクトルを作成します。各オブジェクトには、1つのデータ(9つのdoubleで構成される三角形)が含まれています。各オブジェクトは、.stlファイルから読み取られたデータから順に読み込まれます。必要な静的メソッドは1つだけです。適切なOO設計では、データを直接処理するメソッドを各オブジェクトに配布する必要があります。標準のOOソリューションは次のとおりです。 foreach(obj in vec) { obj.readFromFile(fileName); } 各objはreadFromFile、データとともにのコンパイル済みコードを保持します! この場合、パフォーマンスよりもメモリの方が問題であり、制約されたシステムには大量のデータがあります。 ソリューション: 名前空間メソッド(C ++には最適ですが、Javaでは不可能) objのクラスの1つの静的メソッド。実行可能コードは、実行時に1か所に保持されます。メソッドを呼び出すための小さなオーバーヘッドがあります。 objの派生元の親クラスreadFromFile。プライベートメソッドが含まれます。コールとsuper.callPrivateMethod()その呼び出しreadFromFile。乱雑ですが、各オブジェクトのメモリオーバーヘッドが多少あります。 readFromFileobjのスコープ外に実装するため、vecのクラスまたは呼び出し元のクラスに実装します。私の意見では、これはデータのカプセル化を壊します。 大量のデータの場合、三角形ごとに1つの明示的なオブジェクトを使用するのは最善の方法ではないことに気づきました。これは単なる例です。

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