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

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

11
同じオブジェクトへの2つの参照が必要になるのはいつですか?
特にJavaでは、他の言語でも同様です。同じオブジェクトへの2つの参照がいつ役立つのでしょうか。 例: Dog a = new Dog(); Dob b = a; これが役立つ状況はありますか?でa表されるオブジェクトとやり取りしたいときはいつでも、これが使用するのに好ましいソリューションになるのはなぜaですか?

2
モナドは、継承階層の実行可能な(たぶん望ましい)代替手段ですか?
このようなモナドの言語に依存しない説明を使用します。最初にモノイドを説明します。 モノイドは(おおよそ)のパラメータとして、いくつかの種類を取り、同じ型を返す関数のセットです。 モナドを取る関数の(おおよそ)が設定されているラッパーパラメータとしてタイプと同じラッパー・タイプを返します。 これらは説明であり、定義ではないことに注意してください。その説明を気軽に攻撃してください! したがって、OO言語では、モナドは次のような操作構成を許可します。 Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land() モナドは、含まれるクラスではなく、これらの操作のセマンティクスを定義および制御することに注意してください。 従来、OO言語では、クラス階層と継承を使用してこれらのセマンティクスを提供していました。したがってBird、メソッドtakeOff()、flyAround()およびを持つクラスがありland()、Duckはそれらを継承します。 しかし、その後、penguin.takeOff()失敗するため、飛べない鳥とのトラブルに巻き込まれます。例外のスローと処理に頼らなければなりません。 また、ペンギンがであると言うとBird、たとえばの階層もある場合、多重継承の問題に遭遇しますSwimmer。 基本的に、私たちはクラスをカテゴリーに分類し(カテゴリー理論に謝罪して)、個々のクラスではなくカテゴリーごとにセマンティクスを定義しようとしています。しかし、モナドは階層よりもそれを行うためのはるかに明確なメカニズムのようです。 したがって、この場合、Flier<T>上記の例のようなモナドができます。 Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land() ...そして、インスタンス化することはありませんFlier<Penguin>。おそらくマーカーインターフェイスを使用して、静的な型付けを使用してそれを防ぐこともできます。または、実行時の機能チェックで解決します。しかし、実際には、プログラマーはゼロで割るべきではないという意味で、ペンギンをフライヤーに入れてはいけません。 また、より一般的に適用できます。チラシは鳥である必要はありません。たとえばFlier<Pterodactyl>、またはFlier<Squirrel>、これらの個々のタイプのセマンティクスを変更せずに。 型階層ではなく、コンテナ上の構成可能な関数によってセマンティクスを分類すると、特定の階層に適合する「やる、しない」クラスの古い問題を解決します。また、簡単&はっきりと同じように、クラスの複数の意味を可能にするFlier<Duck>だけでなく、Swimmer<Duck>。動作をクラス階層で分類することにより、インピーダンスの不一致に苦労しているようです。モナドはそれをエレガントに処理します。 私の質問は、継承よりも合成を優先するようになったのと同じように、継承よりもモナドを優先することも理にかなっていますか? (ところで、これがComp Sciにあるのか、それともComp Sciにあるのかはわかりませんでしたが、これは実際的なモデリングの問題のように見えます。

4
複数のインターフェイスを結合する空のインターフェイス
次の2つのインターフェイスがあるとします。 interface Readable { public void read(); } interface Writable { public void write(); } 場合によっては、実装オブジェクトはこれらの1つしかサポートできませんが、多くの場合、実装は両方のインターフェイスをサポートします。インターフェイスを使用する人々は次のようなことをしなければなりません: // can't write to it without explicit casting Readable myObject = new MyObject(); // can't read from it without explicit casting Writable myObject = new MyObject(); // tight coupling to actual implementation MyObject myObject …

5
エンティティコンポーネントシステムアーキテクチャは、定義上オブジェクト指向ですか?
エンティティコンポーネントシステムアーキテクチャは、定義上、オブジェクト指向ですか?それは私にとってより手続き的または機能的だと思われます。私の意見では、オブジェクト指向言語で実装することを妨げるものではありませんが、堅実なオブジェクト指向の方法で実装することは慣用的ではありません。 ECSはデータ(E&C)を動作(S)から分離しているようです。証拠として: アイデアは、エンティティにゲームメソッドを埋め込まないことです。 そして: コンポーネントは、特定の目的に必要な最小限のデータセットで構成されます。 システムは、特定のコンポーネントを持つエンティティのセットを使用する単一目的の機能です これはオブジェクト指向ではないと思います。オブジェクト指向になることの大部分は、データと振る舞いを組み合わせることだからです。 証拠として: 対照的に、オブジェクト指向のアプローチは、プログラムの残りの部分から直接アクセスできない場所にデータを配置することをプログラマに促します。代わりに、データにバンドルされている一般にメソッドと呼ばれる特別に記述された関数を呼び出すことにより、データにアクセスします。 一方、ECSは、行動からデータを分離することのすべてのようです。

5
最新のライブラリがOOPを使用しない理由
私は初心者レベルのC ++プログラマですが、言語の概念はかなりよく理解しています。SDLやOpenGLなどの外部C ++ライブラリを学習し始めたとき、驚いたことに、C ++の概念をまったく使用していないことがわかりました。 たとえば、SDLもOpenGLもクラスや例外を使用せず、関数とエラーコードを優先します。OpenGLでは、glVertex2fのような関数を見てきました。これは、入力として2つのfloat変数を取り、おそらくテンプレートとしてはより良いでしょう。さらに、これらのライブラリは時々marcosを使用しますが、マクロの使用が悪いことは一般的な合意のようです。 全体として、C ++スタイルよりもCスタイルで記述されているようです。しかし、それらはまったく互換性のない言語ですよね? 問題は、なぜ現代のライブラリは、それが書かれている言語の利点を使用しないのかということです。

5
アソシエーション、アグリゲーション、およびコンポジションの使用は何ですか?
カプセル化とは何か、それを実装する3つの手法であるアソシエーション、アグリゲーション、コンポジションについて多くの理論を経験しました。 私が見つけたのは: カプセル化 カプセル化は、クラス内のフィールドをプライベートにし、パブリックメソッドを介してフィールドへのアクセスを提供する技術です。フィールドがプライベートとして宣言されている場合、クラス外の誰もアクセスできないため、クラス内のフィールドは非表示になります。このため、カプセル化はデータ隠蔽とも呼ばれます。 カプセル化は、クラス外で定義された他のコードがコードとデータにランダムにアクセスすることを防ぐ保護バリアとして説明できます。データとコードへのアクセスは、インターフェイスによって厳密に制御されます。 カプセル化の主な利点は、コードを使用する他の人のコードを壊すことなく、実装されたコードを変更できることです。この機能により、カプセル化により、コードの保守性、柔軟性、および拡張性が向上します。 協会 関連付けは、すべてのオブジェクトに独自のライフサイクルがあり、所有者がいない関係です。教師と生徒の例を見てみましょう。複数の生徒が1人の教師に関連付けられ、1人の生徒が複数の教師に関連付けられますが、オブジェクト間に所有権はなく、両方に独自のライフサイクルがあります。どちらも独立して作成および削除できます。 集計 集約は、すべてのオブジェクトに独自のライフサイクルがある特殊な形式の関連付けですが、所有権があり、子オブジェクトは別の親オブジェクトに属することはできません。学科と教師の例を見てみましょう。1人の教師を複数の部門に所属させることはできませんが、部門を削除しても教師オブジェクトは破棄されません。それは「has-a」関係と考えることができます。 組成 合成は再び集約の特殊な形式であり、これを「死」関係と呼ぶことができます。これは強力なタイプの集約です。子オブジェクトにはライフサイクルがありません。親オブジェクトを削除すると、すべての子オブジェクトも削除されます。もう一度、家と部屋の関係の例を見てみましょう。家には複数の部屋を含めることができますが、部屋の独立した生活はなく、2つの異なる家に属することはできません。家を削除すると、部屋は自動的に削除されます。 質問は: 今、これらはすべて実世界の例です。実際のクラスコードでこれらの手法を使用する方法についての説明を探しています。私が意味する、カプセル化のための3つの異なる技術を使用するためのポイントは何か、これらの技術を実装する方法とどのように一度に適用される技術を選択します。

11
情報の隠蔽は慣例以上のものですか?
Java、C#、およびその他の多くの厳密に型指定された静的にチェックされた言語では、次のようなコードを記述するために使用されます。 public void m1() { ... } protected void m2() { ... } private void m2() { ... } void m2() { ... } 動的にチェックされる言語の中には、特定のクラスメンバーの「プライベート」レベルを表すキーワードを提供せず、代わりにコーディング規約に依存しているものがあります。たとえば、Pythonはプライベートメンバーの前にアンダースコアを付けます: _m(self): pass 動的にチェックされる言語でこのようなキーワードを提供することは、実行時にのみチェックされるため、ほとんど使用されないと主張できます。 ただし、これらのキーワードを静的にチェックされた言語で提供する正当な理由も見つかりません。protected迷惑で気を散らすようなかなり冗長なキーワードでコードを埋める必要があると思います。これまでのところ、これらのキーワードによって引き起こされるコンパイラエラーがバグから私を救ったという状況にはありませんでした。まったく逆に、間違って配置されprotectedたためにライブラリを使用できない場合がありました。 これを念頭に置いて、私の質問は次のとおりです。 クラスの公式インターフェースの一部を定義するために使用されるプログラマー間の慣習以上の情報が隠されていますか? クラスの秘密状態を攻撃から保護するために使用できますか?反射はこのメカニズムをオーバーライドできますか?コンパイラが情報の隠蔽を強制することが価値があるのは何ですか?

11
OOPは実世界で支配的なプログラミングモデルですか?
オブジェクトはありませんか?まあ、ほとんどこれまで ACMのコミュニケーションのVIEWPOINTセクションで、「Objects Never?Well、Hardly Ever」という興味深い記事を見つけました。これは、オブジェクトファーストまたはオブジェクトレイトとは根本的に異なる視点です。彼は「オブジェクト-決して」または多分「オブジェクト-大学院」を提案します。 著者はOOPについて話し、OOPが実際のプログラミング環境でどのように使用されるかについて質問しました。彼は、OOPは支配的なプログラミングモデルではないと考えています。たとえば、プログラミングの70%は、OOPがあまり適していない組み込みシステム向けに行われていると彼は言います。 大学の一部の教授は、OOPの利点について話したい場合、コードの再利用について話します。別の例として、再び、彼は、これは現実世界の実際のケースではない、と主張します。コードの再利用は大学で主張されているものよりも難しい: OOPの使用は、ほとんどの人が信じているほど普及しておらず、支持者が主張するほど成功していないため、CSカリキュラムの中心的な位置は正当化されないと主張します。 スタックオーバーフローの人々がこれについてどのように考えているかを知るのは興味深いですか?OOPは、プログラマーの観点から見れば、主要なプログラミングモデルですか? アプローチを1つだけ選択/学習/使用する必要がある場合、それはOOPですか?どうして?

9
init()メソッドはコード臭いですか?
init()型のメソッドを宣言する目的はありますか? 私はコンストラクタよりも優先init()すべきかどうか、または宣言を避ける方法をinit()尋ねていません。 メソッドを宣言する背後に何らかの理由があるのかinit()(それがどれほど一般的かを見て)、それがコードのにおいであり、避けるべきかどうかを尋ねています。 init()イディオムは非常に一般的ですが、私は、任意の真のメリットを見ていません。 メソッドによる初期化を促進する型について話している: class Demo { public void init() { //... } } これはいつプロダクションコードで使用されますか? コンストラクターがオブジェクトを完全に初期化せず、部分的に作成されたオブジェクトを生成することを示唆しているため、コードの匂いがするかもしれません。状態が設定されていない場合、オブジェクトは存在しないはずです。 これは、エンタープライズアプリケーションの意味で、生産をスピードアップするために使用されるある種の手法の一部である可能性があると信じさせてくれます。それは私がそのようなイディオムを持つことを考えることができる唯一の論理的な理由です。

7
パターンと原理の違い
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 オブジェクト指向のデザインパターンと原則の違いは何ですか?それらは異なるものですか?私が理解している限り、両方とも共通の目標(柔軟性など)を達成しようとします。パターンは原則であり、その逆も言えると思いますか? 設計原理= SOLID(つまり、依存関係反転の原理) デザインパターン= Gof(抽象ファクトリーパターン)

3
C ++の「メソッド」について(「メンバー関数」に対して)話すのはどれほど間違っていますか?
私は理解して C ++の仕様に応じてそこに「方法」のようなものはなく、いくつかのことを(多くの?ほとんどの?)C ++プログラマは、Javaイズムする「方法」を検討してください。一方で、C ++フォーラムでも、人々はけいれんせずにメソッドについて話すようです。この用語に関する既知の慣例または一般的な慣行を探しています。 C ++とJavaの両方のバージョンを持つAPIを文書化しています。開発者は、おそらく移植とテストの利便性のために、クラスとメソッド/メンバー関数の名前を2つの間で同じにしておきました。このため、これらのAPIについて文書化する必要があるものの一部は、言語の選択の「上」にあります。FoosとBarsについて、baz()とmumble()...メソッドで一般的に話せるようにする必要がありますか? Javaプログラマーがそれを自然とみなす方法について話すと、C ++プログラマーはおそらく理解するでしょうが、一部の人はそれが間違っていると考えるでしょう。私の質問は、これは実際にはどれほど凶悪なのですか?C ++固有の関数とは対照的に、「一般的なOOP」コンテキストでは、C ++メンバー関数は従来どのように話題にされていますか?どちらの言語でも正しくない方法でメンバー関数について話すより良い方法はありますか?(「メンバー関数」は少し冗長です。) これは世論調査ではありません。この問題に対処するための実際の慣習や一般的な慣行があるかどうかを判断しようとしています。 私はこの質問を知っていますが、それは一般にOOPに関するものであり、特定の言語については尋ねません。

4
インスタンス変数が多すぎるとコードが重複しますか?
パターンのリファクタリングによると: クラスが多くのことをしようとすると、多くの場合、インスタンス変数が多すぎます。クラスのインスタンス変数が多すぎる場合、複製されたコードはそれほど遅れることはありません。 インスタンス変数が多すぎるとコードが重複しますか?

3
事前条件の強化と事後条件の弱化は、リスコフ代替原理にどのように違反しますか?
次の場合、リスコフの置換原則に違反していると読みました。 前提条件が強化されている、または 事後条件が弱体化 しかし、これらの2つの点がリスコフの代替原則にどのように違反するかは、まだ完全にはわかりません。例を挙げて説明してください。具体的には、上記の条件のいずれかが、サブクラスオブジェクトをスーパークラスオブジェクトに置き換えることができない状況をどのように引き起こしますか?

3
「Java OOP」と「Pythonic OOP」の違いは?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 ActionScript 2.0で始めてから、Javaで始めました。それ以来、Python(おそらく私のお気に入り)を含む多くの言語を学んだか、少なくとも使用しました。 私のオブジェクト指向プログラミングのスタイルは、Pythonシンタックスを使用したJava OOPのようなものではなく、非常にPythonに近いものではないのではないかと心配しています。JavaとPythonic OOPの違いは何ですか?Pythonでオブジェクト指向のコードを書くとき、Javaプログラマーはしばしば「非Python」に何をしますか?

4
インスタンスフィールドに依存しないメソッドを静的にしますか?
最近、統合テストフレームワーク用、Javaプロジェクト用にGroovyでプログラミングを開始しました。Intellij IDEAをGroovyプラグインで使用していますが、非静的でインスタンスフィールドに依存しないすべてのメソッドの警告として表示されて驚いています。ただし、Javaでは、これは問題ではありません(少なくともIDEの観点から)。 インスタンスフィールドに依存しないすべてのメソッドを静的関数に変換する必要がありますか?trueの場合、これはGroovy固有のものですか、それとも一般的なOOPで利用可能ですか?なぜ?

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