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

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

6
抽象クラスにはどのコードを含める必要がありますか?
最近、抽象クラスの使用について困っています。 時々、抽象クラスが事前に作成され、派生クラスがどのように機能するかのテンプレートとして機能します。つまり、多かれ少なかれ、それらはいくつかの高レベルの機能を提供しますが、派生クラスによって実装される特定の詳細を除外します。抽象クラスは、いくつかの抽象メソッドを配置することにより、これらの詳細の必要性を定義します。そのような場合、抽象クラスは設計図、機能の高レベルの説明、またはそれと呼ぶもののように機能します。単独では使用できませんが、高レベルの実装から除外された詳細を定義するために専門化する必要があります。 場合によっては、いくつかの「派生」クラスの作成後に抽象クラスが作成されることがあります(親/抽象クラスがそこにないため、それらはまだ派生されていませんが、私が何を意味するか知っています)。これらの場合、抽象クラスは通常、現在の派生クラスに含まれるあらゆる種類の共通コードを配置できる場所として使用されます。 上記の観察をしたので、私はこれらの2つのケースのどちらがルールであるべきか疑問に思っています。派生クラスすべてに共通しているという理由だけで、抽象クラスに詳細を吹き込む必要がありますか?高レベルの機能の一部ではない一般的なコードがありますか? たまたま派生クラスに共通しているからといって、抽象クラス自体には意味がないコードが存在する必要がありますか? 例を挙げましょう。抽象クラスAにはメソッドa()と抽象メソッドaq()があります。メソッドaq()は、派生クラスABとACの両方で、メソッドb()を使用します。b()をAに移動する必要がありますか?もしそうなら、誰かがAだけを見ている場合(ABとACがそこにないふりをしよう)、b()の存在はあまり意味がありません!これは悪いことですか?誰かが抽象クラスを見て、派生クラスにアクセスせずに何が起こっているのかを理解できる必要がありますか? 正直なところ、この質問をしている時点で、派生クラスを調べなくても意味のある抽象クラスを書くことは、クリーンなコードとアーキテクチャの問題だと信じがちです。anyあらゆる種類のコードのダンプのように機能する抽象クラスのアイデアが、すべての派生クラスで一般的に発生するのを嫌う あなたはどう思いますか/練習しますか?

3
インターフェースが具象クラスに依存することは問題ありませんか?
カスタムエラーハンドラーのJavaでインターフェイスを作成しています。 引数エラーオブジェクトを渡したいのですが、Exceptionクラスの子である必要があります。 定義したクラス名をインターフェイスで使用しても大丈夫ですか? 実装に依存しないという点で、インターフェースを少なくしませんか? 私はこのようなことをやろうとします: public class CustomException { /* ... Implementation ... */ } public interface Interface { void onError(CustomException ex); }

2
インターフェース分離の原則:インターフェースに大きな重複がある場合はどうすればよいですか?
アジャイルソフトウェア開発、原則、パターン、およびプラクティス:ピアソン新国際版: 場合によっては、クライアントの異なるグループによって呼び出されるメソッドが重複することがあります。オーバーラップが小さい場合、グループのインターフェースは分離したままにする必要があります。共通の関数は、オーバーラップするすべてのインターフェースで宣言する必要があります。サーバークラスは、これらの各インターフェイスから共通の機能を継承しますが、実装するのは1回だけです。 ボブおじさんは、少しの重複がある場合について話します。 大きな重複がある場合はどうすればよいですか? 私たちは持っていると言います Class UiInterface1; Class UiInterface2; Class UiInterface3; Class UiIterface : public UiInterface1, public UiInterface2, public UiInterface3{}; 間にかなりの重複がある場合、我々は何をすべきUiInterface1とはUiInterface2?

1
Pythonの結合は、結合するアイテムではなく、設計上の理由から、RubyやSmalltalkと比較してシンボルに焦点を当てているようです。
OOPの基礎の1つは、私たちが処理したい項目であるオブジェクトを持っていること、そしてそれらにメッセージを送信することだと思いました。 したがって、当然のことながら、アイテムのコレクションがあり、それらを1つの文字列に入れる必要があるため、次のようにします。 ["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby (Smalltalkも同じ方法です)。これ" | "は、何らかの方法で、それを結合する方法の1つのトークンとしての議論と考えられています。それはすることができ" "、ゲームボードを簡素にする場合、あまりにも。したがって、結合要素" | "は、特に私たちが関心を持っているものではありません。特に重要または重要なのは、プログラムの主要なオブジェクトではありません。 Pythonがそれを使用する場合 " | ".join(["x", "o", "o"]) 何かについて議論をするために、私たちが議論にメッセージを渡しているように感じるのは、少し奇妙に感じます。多分Pythonはもっと手続き的ですか?参加する文字列に私たちに何らかの義務を果たすように伝えるには? 実装を保存して、joinコレクションクラスごとにを定義する必要がないようにするのですか?しかし、Rubyなどの任意のコレクションクラスに対して1回だけ記述することもできるというのは本当ではありません。 module Enumerable def my_join(joiner) self.inject {|a,b| a.to_s + joiner + b.to_s} end end (このようなものは、to_s各項目を呼び出しto_s、各クラスのに依存して独自の適切な処理を実行し、文字列に変換してから、それらを連結します)。そのため、文字列、ハッシュ、セットのそれぞれ、または私たちが持っているあらゆるコレクションクラスを実装する必要はありません。 または、Pythonは正しくOOPルートになりませんか?これは、使用len("abc")してtype([])の代わりに、"abc".len()または[].type()さえのpython3でもそれはそうです。Pythonは設計上の理由でこのようにしていますか?

2
UMLダイアグラムを使用してコードの編成方法を計画することが不適切なのはなぜですか?
そのため、はい、図が不適切な場合があります。彼らはいつ不適切ですか?それらを検証するためのコードなしでそれらを作成し、それらに従うことを意図している場合。アイデアを探求するために図を描くことには何の問題もありません。 アジャイルソフトウェア開発:原則、パターン、および実践-Robert C. Martin これは正確にはどういう意味ですか?UMLは、「ダイブイン」する前にコードを構造化する方法を計画するのに役立つように設計されていませんか?あなたが思いついた図に従わない場合、それを使用する意味は何ですか? コンテキスト:この章では、ボブおじさんがボウリングゲームのスコアキーパーのUML図を作成します。次に、UML図を調べずに、テスト駆動の方法でプログラムを開発します。結果のプログラムはUMLダイアグラムとは異なり、ボブおじさんは上記の結論に達します。

2
エンティティの既知のビジネスIDは、DDD / OOPの専用タイプで表す必要がありますか?
実際には、カスタムタイプ(不変)classをstring他のプリミティブ型の上で使用することを意味します。 例: 出版:国際標準図書番号。 金融:国際証券識別番号。 利点: 識別子の形式を確認できます。 モデルのファーストクラスのメンバーになります。 短所: 永続化の摩擦を追加します(例:Entity Framework)。 より多くのコード。

5
Javaの「インターフェイスへのプログラム」は常に意味がありますか?
インターフェイスから実装するクラスがどのようにインスタンス化されるかに関するこの質問での議論を見てきました。私の場合、私はのインスタンスを使用するJavaで非常に小さなプログラムを書いており、TreeMapそこでの皆の意見によると、次のようにインスタンス化する必要があります。 Map<X> map = new TreeMap<X>(); 私のプログラムでmap.pollFirstEntry()は、Mapインターフェイスで宣言されていない関数(およびMapインターフェイスにも存在する他のカップル)を呼び出しています。私はTreeMap<X>次のようにこのメソッドを呼び出すすべての場所にキャストすることでこれを行うことができました: someEntry = ((TreeMap<X>) map).pollFirstEntry(); 上記の初期化ガイドラインの利点を大規模プログラムで理解していますが、このオブジェクトが他のメソッドに渡されない非常に小規模なプログラムの場合は、不要だと思います。それでも、私はこのサンプルコードを求人アプリケーションの一部として書いており、コードの見栄えを悪くしたり、散らかしたりしたくありません。最もエレガントなソリューションは何でしょうか? 編集:私は、特定の関数を適用するよりも、広く適切なコーディング方法に関心があることを指摘しておきますTreeMap。一部の回答は既に指摘されている(そして、最初に回答したものとしてマークした)ため、機能を失うことなく、可能な限り高い抽象化レベルを使用する必要があります。

4
階層を強制せずに、オブジェクトを相互に作用させて通信するにはどうすればよいですか?
これらのとりとめのない質問で私の質問が明確になることを願っています。ただし、そうでない場合は完全に理解できます。その場合はその旨をお知らせください。さらに明確にしていきます。 オブジェクト指向のゲーム開発に精通するために私が作成した非常に単純なゲームであるBoxPongに出会ってください。ボックスをドラッグしてボールを操作し、黄色い物を集めます。 BoxPongを作成することは、とりわけ、基本的な質問の策定に役立ちました。互いに「所属する」必要なしに、互いに対話するオブジェクトをどのようにして持つことができますか?言い換えれば、オブジェクトが階層的ではなく、代わりに共存する方法はありますか?(以下でさらに詳しく説明します。) オブジェクトの共存の問題はよくある問題だと思うので、解決する確立された方法があるといいのですが。私は四角いホイールを作り直したくないので、私が探している理想的な答えは「ここに、あなたの種類の問題を解決するために一般的に使用される設計パターンがある」と思います。 特にBoxPongのような単純なゲームでは、同じレベルで少数のオブジェクトが共存している、または共存している必要があることは明らかです。箱があり、ボールがあり、収集品があります。オブジェクト指向言語で表現できるのは、厳密なHAS-A関係だけですが、そうです。これは、メンバー変数を介して行われます。私は単に始めてballそれを実行させるだけではなく、永久に別のオブジェクトに属している必要があります。メインのゲームオブジェクトは、そのので、私はそれを設定した持っているボックスを、ひいてはボックスがありたボールを、そして持っているスコアカウンターを。各オブジェクトには、update()位置、方向などを計算するメソッドと同じように移動します。メインのゲームオブジェクトのupdateメソッドを呼び出します。このメソッドは、すべての子のupdateメソッドを呼び出し、次に、すべての子のupdateメソッドを呼び出します。これがオブジェクト指向のゲームを作るために私が見ることができる唯一の方法ですが、それは理想的な方法ではないと感じています。結局のところ、私はボールをボックスに属していると正確に考えるのではなく、同じレベルにいて、それと相互作用していると考えています。これは、すべてのゲームオブジェクトをメインゲームオブジェクトのメンバー変数に変換することで実現できると思いますが、何も解決しないと思います。つまり...明らかな混乱をさけて、ボールとボックスがどのようにしてがお互い知る、つまり相互作用か? また、オブジェクト間で情報を渡す必要があるという問題もあります。私はSNESのコードを書くのにかなりの経験があります。そこでは、実質的に常にRAM全体にアクセスできます。スーパーマリオワールドのカスタム敵を作成していて、マリオのコインをすべて削除して、ゼロを格納して$ 0DBFに対処したいとします。問題ありません。敵がプレイヤーのステータスにアクセスできないという制限はありません。C ++などでは、他のオブジェクト(またはグローバル)から値にアクセスできるようにする方法に疑問を感じることが多いので、私はこの自由に甘やかされていると思います。 BoxPongの例を使用して、ボールが画面の端から跳ね返るようにしたい場合はどうなりますか?widthそして、heightのプロパティであるGameクラスは、ballそれらにアクセスできるようにします。これらの種類の値を(コンストラクターまたは必要なメソッドを介して)渡すこともできますが、それは私にとって悪い習慣であるだけです。 私の主な問題は、お互いを知るためにオブジェクトが必要であるということですが、それを行うために私が見ることができる唯一の方法は、厳密な階層であり、これは醜く非実用的です。 私はC ++の「友達クラス」について聞いたことがありますが、それらがどのように機能するかは知っていますが、それらが最終的な解決策である場合、どうして表示されないのですか friendすべてのC ++プロジェクト全体にキーワードが注がれて概念はすべてのOOP言語に存在するわけではありませんか?(私が最近学んだばかりの関数ポインターについても同じことが言えます。) あらゆる種類の回答を事前にありがとう—そして、あなたに意味をなさない部分があれば、私に知らせてください。

4
このシナリオでは訪問者パターンは有効ですか?
私のタスクの目標は、スケジュールされた繰り返しタスクを実行できる小さなシステムを設計することです。定期的なタスクとは、「月曜日から金曜日の午前8時から午後5時まで、毎時間管理者にメールを送信する」のようなものです。 RecurringTaskという基本クラスがあります。 public abstract class RecurringTask{ // I've already figured out this part public bool isOccuring(DateTime dateTime){ // implementation } // run the task public abstract void Run(){ } } また、RecurringTaskから継承されたクラスがいくつかあります。それらの1つはSendEmailTaskと呼ばれます。 public class SendEmailTask : RecurringTask{ private Email email; public SendEmailTask(Email email){ this.email = email; } public override void Run(){ …

8
オブジェクト指向とアルゴリズムの関係
私がいくつかのアルゴリズムの教科書を読んでいるとき、それらはいくつかの問題(ソート、最短経路)またはいくつかの一般的な方法(再帰アルゴリズム、分割統治、動的プログラミング...)の賢い手順でいっぱいです。そこではオブジェクト指向プログラミングの痕跡をいくつか見つけました。(なぜそれらはより手続き指向であるのですか?) それから私は考えていました: アルゴリズムとOOPの関係は何ですか?2つの独立したトピックですか? OOPでしか表示および解決できない問題はありますか? OOPはアルゴリズムをどのように支援できますか?それともどの方向に影響を与えることができますか?

5
OOP言語およびタイプのクラス
プログラミング言語理論では、型は値のセットです。たとえば、「int」型はすべての整数値のセットです。 OOP言語では、クラスはタイプですよね? クラスが複数のメンバーで定義されている場合、例えば class myclass{ int a; double b; } クラスについて話すとき、 「(a,b)どこaint型で、b二重である」、または 「{ (x,y)| xは任意のint、y任意のdoubleです}」? のインスタンスはmyclassどういう意味ですか? 「(a,b)どこaint型で、b二重である」、または メモリ空間を占有し、(必ずしもそうである必要はない、つまり空である可能性があります)を格納できるオブジェクト(x,y)。ここxで、int yはあり、doubleはありますか?

4
クラスのメソッドは、それ自体を変更した後、いつ同じインスタンスを返す必要がありますか?
私は3つのメソッドを持つクラスを持っているA()、B()とC()。これらのメソッドは、独自のインスタンスを変更します。 インスタンスが別のコピーである場合(同様に)、メソッドはインスタンスClone()を返すvoid必要がありreturn this;ますが、メソッドで同じインスタンスを変更し、他の値を返さない場合は、同じインスタンス()を返すか、自由に選択できます。 同じ変更されたインスタンスを返すことを決定するとき、のようなきちんとしたメソッドチェーンを実行できますobj.A().B().C();。 これがそうする唯一の理由でしょうか? 自分のインスタンスを変更して返すこともできますか?それとも、コピーのみを返し、元のオブジェクトを以前のままにしておくべきですか?同じ変更されたインスタンスを返す場合、ユーザーは戻り値がコピーであると想定する可能性があるため、それ以外の場合は返されませんか?それが問題なければ、メソッドでそのようなことを明確にする最良の方法は何ですか?

6
かなりの時間、私は静的クラスの代わりにオブジェクトを持つ理由を考えることができません。オブジェクトは私が思うよりも多くの利点がありますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前休業。 私はオブジェクトの概念を理解しており、Javaプログラマーとして、OOパラダイムは実際にはかなり自然に生まれてくると感じています。 しかし最近、私は自分自身が考えていることに気づきました。 ちょっと待ってください、実際に静的クラスを使用するよりもオブジェクトを使用することの実際的な利点は何ですか(適切なカプセル化とOOプラクティスで)。 オブジェクトを使用することの2つの利点を考えることができます(どちらも重要で強力です)。 ポリモーフィズム:実行時に動的かつ柔軟に機能を交換できます。また、システムに新しい機能「パーツ」と代替手段を簡単に追加することもできます。たとえばCar、Engineオブジェクトを操作するように設計されたクラスがあり、Carが使用できるシステムに新しいエンジンを追加したい場合、新しいEngineサブクラスを作成して、 このクラスのオブジェクトをオブジェクトに渡すだけで済み Carます。について何かを変更しCarます。そして、実行時にそうすることを決定できます。 「機能を渡す」ことができる:システムの周りにオブジェクトを動的に渡すことができます。 しかし、静的クラスよりもオブジェクトに他の利点はありますか? 多くの場合、新しい「パーツ」をシステムに追加するときは、新しいクラスを作成し、そこからオブジェクトをインスタンス化します。 しかし、最近立ち止まって考えたところ、静的クラスは、オブジェクトを通常使用する多くの場所で、オブジェクトとまったく同じように機能することに気付きました。 たとえば、アプリにファイルの保存/読み込みメカニズムを追加する作業をしています。 オブジェクトを使用すると、コードの呼び出し行は次のようになります。 Thing thing = fileLoader.load(file); 静的クラスを使用すると、次のようになります。 Thing thing = FileLoader.load(file); 違いは何ですか? かなり古いことですが、私は、昔ながらの静的クラスがまったく同じように動作するときに、オブジェクトをインスタンス化する理由を考えることができません。しかし、OOシステムでは、静的クラスはほとんどありません。だから私は何かを逃しているに違いない。 リストした2つのオブジェクト以外のオブジェクトには、他に利点がありますか?説明してください。 編集:明確にします。機能を交換したり、データを渡したりするときに、オブジェクトは非常に便利です。たとえば、メロディーを構成するアプリを作成しました。MelodyGenerator異なる方法でメロディーを作成するいくつかのサブクラスがあり、これらのクラスのオブジェクトは交換可能でした(Strategyパターン)。 メロディーもオブジェクトを渡すことができたので便利です。コードとスケールもそうだった。 しかし、システムの「静的な」部分についてはどうですか?それは渡されません。たとえば、「ファイルを保存する」メカニズムです。静的クラスではなくオブジェクトに実装する必要があるのはなぜですか?

2
JavaScriptのヘルパー関数に推奨されるアプローチは何ですか?
ヘルパー関数の推奨アプローチは何ですか?1つの手法を選択し、それを実行して新しい「クラス」を作成します。 ここに私が考えたデザインオプションがあります: オプション1:外部スコープのヘルパー関数、インスタンスのコンテキストで呼び出す function createPane (pane) { // logic to create pane var proto = Object.create(this.paneList); $.extend(paneProto, pane); return paneProto; } Panes.prototype.initialize = function (panes) { var _this = this; _.each(panes, function () { _this.panes.push(createPane.call(_this, this)); }); } 長所:単純な構文。createPaneインスタンスで公開されていません。 短所: createPane他のスコープでアクセスできます。 オプション2:クロージャー内のヘルパー関数、インスタンスのコンテキストで呼び出す Panes.prototype.initialize = (function () { function createPane (pane) …

9
異なるプログラミング言語でOOPを学習することに違いはありますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 6年前休業。 OOPを学びたいです。私はPythonを知っており、OOPについてはほとんど知りません。 しかし、フォーラムで「learn OOP」を検索すると、「Pythonは非常に新しいため、PythonでOOPを学習できないのです。Javaを学習してから、JavaでのOOPを理解する必要がある」という男を見かけました。 本当ですか?異なるプログラミング言語でOOPを理解するのに違いはありますか?Java、C#、C ++、Perl、Pythonで学習したいですか?

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