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

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

3
コードの重複や不明確なパラメーターの通過を回避するためのクライアントAPIのリファクタリング
APIを開発する必要があります。APIの機能は、サーバーによって公開されているサービスを呼び出すリクエストです。 最初、APIは次のように機能しました。 class Server: def firstRequest(self, arg1, arg2): # block of code A async = Async() async.callFirstRequest(arg1, arg2) # block of code B def secondRequest(self, argA, argB, argC): # block of code A (identical to that of firstRequest) async = Async() async.callSecondRequest(argA, argB, argC) # block of code B (identical …

7
「オブジェクトが特定の状態にある場合にのみ許可されるオブジェクトの操作」の設計パターン
例えば: まだレビューまたは承認されていない求人応募のみを更新できます。言い換えれば、人は、HRがレビューを開始するまで、またはすでに承認されるまで、ジョブアプライアンスフォームを更新できます。 したがって、求人応募は次の4つの状態になります。 APPLIED(初期状態)、IN_REVIEW、APPROVED、DECLINED どうすればこのような動作を実現できますか? 確かに、Applicationクラスにupdate()メソッドを記述し、アプリケーションの状態を確認し、アプリケーションが必要な状態でない場合は何もしないか、例外をスローすることができます しかし、この種のコードは、そのようなルールが存在することを明らかにしていません。それにより、だれでもupdate()メソッドを呼び出すことができ、クライアントが失敗した後にのみ、そのような操作が許可されなかったことがわかります。したがって、クライアントはそのような試みが失敗する可能性があることを認識する必要があるため、注意が必要です。クライアントがそのようなことを認識していることは、ロジックが外部にリークしていることも意味します。 状態ごとに異なるクラス(ApprovedApplicationなど)を作成して、許可されたクラスにのみ許可された操作を実行してみましたが、この種のアプローチも間違っているように感じます。 そのような振る舞いを実装するための公式の設計パターン、または単純なコードはありますか?

2
合成されたオブジェクトへのポインタを返すことはカプセル化に違反しますか
他のオブジェクトを集約するオブジェクトを作成する場合、パススルー関数を使用して内部オブジェクトへのインターフェイスを公開するのではなく、内部オブジェクトへのアクセスを許可したいと思います。 たとえば、2つのオブジェクトがあるとします。 class Engine; using EnginePtr = unique_ptr<Engine>; class Engine { public: Engine( int size ) : mySize( 1 ) { setSize( size ); } int getSize() const { return mySize; } void setSize( const int size ) { mySize = size; } void doStuff() const { /* do stuff …

3
独自の例外を作成する必要がありますか、それともわずかに非標準的な目的で同様の例外を選択する必要がありますか?
これは一般的なデザインの質問ですが、私がC#と.NETに焦点を合わせています。これは、これらが現在使用している言語だからです。 独自の新しい例外クラスを作成する必要がありますか、それともわずかに異なる目的で既存のフレームワーク例外を選択する必要がありますか? たとえば、メンバ(つまり、型など)が予期されていたが、を使用してアセンブリを読み取っているときに見つからなかったことを示す例外が必要であることがわかりましたMono.Cecil。基本クラスライブラリは例外を定義しますMissingMemberException。これは、私が欲しいものを正確に伝えているようですが、説明では次のように述べています。 存在しないクラスメンバーに動的にアクセスしようとした場合にスローされる例外。 メンバーに動的にアクセスするのではなく、アセンブリを受動的に操作するため、これは正確には適合しません。

4
静的クラスの有効な用途は何ですか?
C#などのオブジェクト指向言語で静的クラスを使用しているプログラマーを目にするたびに、彼らが間違っていることに気づきました。主な問題は明らかにグローバルな状態であり、実行時に、またはテスト中にモック/スタブを使用して実装を交換することの難しさです。 好奇心から、十分にテストされたプロジェクトを選択するプロジェクトのいくつかを見て、実際にアーキテクチャとデザインについて考えようと努力しました。私が見つけた静的クラスの2つの使用法は次のとおりです。 ユーティリティクラス— このコードを今日作成している場合は避けたいものですが、 アプリケーションキャッシュ:そのための静的クラスの使用は明らかに間違っています。MemoryCacheまたはRedis に置き換えたい場合はどうなりますか? .NET Frameworkを見ると、静的クラスの有効な使用例も見当たりません。例えば: File静的クラスを使用すると、代替クラスに切り替えるのが非常に困難になります。たとえば、分離ストレージに切り替えるか、ファイルをメモリに直接格納する必要がある場合、またはNTFSトランザクションをサポートできる、または少なくとも259文字を超えるパスを処理できるプロバイダーが必要な場合はどうでしょうか。持つ共通のインタフェースと複数の実装は、使用して同じように簡単現れるFileコードベース要件の変更のほとんどを書き換えることではないの恩恵で、直接。 Console静的クラスはテストを非常に複雑にします。ユニットテスト内で、メソッドが正しいデータをコンソールに出力することをどのように確認すべきですか?Stream実行時に注入される書き込み可能に出力を送信するようにメソッドを変更する必要がありますか?非静的コンソールクラスは、静的クラスと同じくらい単純で、静的クラスのすべての欠点がないように思われます。 Math静的クラスも適切な候補ではありません。任意精度の演算に切り替える必要がある場合はどうなりますか?それとも、より新しく、より高速な実装ですか?または、単体テスト中にMathクラスの特定のメソッドが実際にテスト中に呼び出されたことを通知するスタブに? Programmer.SEで、私は読んだ: C#で「静的」を使用しないでください。一部の回答は、静的クラスに完全に反しています。他の人は、「静的メソッドは使用しても問題がなく、プログラミングで正当な場所がある」と主張しますが、引数でそれを焼き付けないでください。 シングルトンを使用する場合と静的クラスを使用する場合。ユーティリティクラスには問題があると上記で述べたので、ユーティリティクラスについて説明します。 なぜ、いつクラスを「静的」にする必要がありますか?クラスの「静的」キーワードの目的は何ですか?言及されている唯一の有効な使用法は、拡張メソッドのコンテナです。すごい。 拡張メソッドとは別に、静的クラスの有効な用途は何ですか。つまり、依存性注入またはシングルトンが不可能であるか、設計の品質が低下し、拡張性と保守が難しくなる場合ですか。

1
MVCでは、モデルにサブビューモデルを含める必要がありますか?
背景: 同僚と私はMVCの解釈が異なります。つまり、同じ問題を考えると、根本的に異なる解決策が考えられます。彼はJavaのバックグラウンド出身で、MVCのすべてのコンポーネントが伝統的にオブジェクトをモデル化している可能性があります。私はHaskellのバックグラウンド出身で、OOPの経験はほとんどありません。 問題空間: モデル化しようとしている問題は、デスクトップ環境に少し似ています。ユーザーセッション(おそらくユーザーのログイン、デスクトップの背景)とデスクトップ上のプロセス(iTunes、Finderなど)には、それぞれ独自のモデルプロパティ(最小化など)があるという概念があります。 次の点に同意します。HMVCが最も優れた表現であると考えています。Session(デスクトップ)とProcess(アプリケーション)の2つのMVCオブジェクトがあること、およびProcessの概念Sessionやバックリンクを必要としないことに同意します。 ただし、MVCの中心的な意味と、ユーザーのデスクトップ上のプロセスのリストを保持する場所にどのように影響するかについては、意見の相違があります。 彼の解釈: 彼は伝統的にコードやレンダリングシステムで簡単にモデル化できる非常に有効なポイントを主張しています。彼は、プロセスのリストはProcessControllerオブジェクトのリストである必要があり、SessionControllerその中にモデルが個別のオブジェクトとして内部に含まれていると述べています。状態の、かなりの量の両方の中にあることをこれは意味SessionControllerし、SessionModelどのように関連しているSessionViewレンダリングする必要があります。 これは、簡単な検索でインターネット上で読み取ることができたものと非常に調和しているようです。 私の解釈: 私の解釈は最大のアーキテクチャ変更を必要とし、コードでの実装は難しいようですが、概念的には正しいと思います。なぜこれが当てはまらないのか、またはこの解釈と一致する別のモデル(MVCでない場合)を提示し、両方のパターンの長所と短所を強調して、最も情報に基づいた決定を下せるように誰かに説明してほしい(どちらも持っていない)ソフトウェアアーキテクチャの強力な背景)。 :私は3つの交換部品とトライアドとしてMVCを参照してくださいModel、ControllerとView。これは、私がインターネット上で読むことができるものと一致し、一部のソースは、「同じインターフェースを持つビュー、コントローラー、およびモデルは、異なる効果に交換可能である必要がある」のようなものに沿って物事を言うでしょう。これが機能すると想像する方法は次のとおりです。 モデルを交換すると、データの検証または保存の方法が変わります コントローラを交換すると、ページの動作が変更されますが、ページの一般的なデータコンテンツを変更する可能性があるものは変更されません ビューを交換すると、ページの表示方法が変わります このことから、私は任意の与えられたことを推論Modelし、Viewコントローラだけで行動していないページの「内容」を変更する必要があるため、唯一のコントローラはデータにページを変更しないでくださいスワッピング最初にレンダリングします。これは、鉄道システムの「駅コントローラー」としてのコントローラーの概念的な視覚化、モデルとしての鉄道の計画、および実際の物理的な外観とトラックの外観/感触(異なるフレーバーでは、「ビューとして「リアル」または「バーチャル3D」)。 ここで私たちは反対します: でユーザーに表示されるデータSessionViewはデスクトップ上のさまざまなプロセスによって変更されるため(プロセスは関連データとしてモデル化しています)、にSessionModelはのインスタンスのリストが含まれているはずですProcessModel。つまりSessionController、同じでランダムを使用すると、SessionView概念的に同じデータ(デスクトップ上のプロセス)が表示されるはずです。 彼は、Model別のモデルについて決して知らない方がより意味があると主張しています。つまり、SessionControllerにはのリストがProcessControllerあり、各Controllerオブジェクトにはそのモデルへのリンクがあります。a SessionViewが同じSessionModelでも異なるSessionController場合、ユーザーに表示されるデータは根本的に異なるはずです。 それぞれの解釈について議論し、最も十分な情報に基づいた結果に到達するために私たちを助けてください。 御時間ありがとうございます!

4
OOD:Java継承とキャストによる子メソッドへのアクセス
私はいくつかのクラス持っているParentとしChild1... Child9Javaで実装されています。Parent抽象クラスであり、子クラスのすべての共通変数(多くのParent場合、インターフェースではなく抽象クラスを作成した主な理由です)、いくつかの抽象メソッド、およびいくつかの実装されたメソッドを含みます。 一部の子クラスには、それらに固有のカスタムメソッドがあります。ダウンキャストを使用して子メソッドを呼び出すことがよくあります。 Parent p = new Child1(); ((Child1) p).child1SpecificMethod(); どういうわけか、これはOODの悪い習慣だと感じていますが、それが本当にデザインの改善方法であるかどうかはよくわかりません。 -編集- とにかく変更する必要があるのは、多くの(今のところ)共通変数を整理するためにParentクラスを使用し、それらを具象クラスのメンバー(またはコンテナーオブジェクト)にすることです。

3
オブジェクトの同一性と可変性
私はJavaの値型の提案を読んでいて、この文に出くわしました。「オブジェクトIDは可変性をサポートするためだけに機能し、オブジェクトの状態は変更できますが、同じ組み込みオブジェクトのままです。」 (仮にではあるが)私が理解していることから、オブジェクトIDは、変数がメモリ内の他の場所にあるオブジェクト(JavaまたはC#のヒープでインスタンス化されたオブジェクトなど)へのポインタまたは参照として機能するという考えです。では、これはオブジェクトの可変性とどう関係しているのでしょうか?これは、たとえば、C ++でスタックにインスタンス化されたオブジェクトが不変であることを意味しますか?ここのリンクが表示されません。

3
C ++アプリケーションでの依存関係(DI)の注入
依存性注入で遊んでいますが、正しく実行されているかどうかはわかりません。特に、依存関係が注入されたクラスを構築するための正しい方法が何かはわかりません。 クラスBを作成するクラスAがあるとします。クラスBはクラスCに依存し、クラスCはクラスDに依存します。クラスDの作成を担当するのは誰ですか? クラスAの場合もあります。ただし、大規模なシステムでは、クラスAが非常に多数のオブジェクトを作成してアセンブルする場合があります。 D、C、Bを作成する個別のビルダークラス。Aはこのビルダークラスを使用します。 その他のオプション。 また、DIコンテナーについてもよく読みました。ただし、C ++には主要なフレームワークがないようです。また、私が正しく理解すれば、コンテナーがなくてもDIはうまく実行できます。私は正しいですか?

3
オブジェクト指向プログラミング言語は「集合コンストラクター」をサポートしていますか?
いくつかのオブジェクトが互いに依存している場合があるため(たとえば、循環参照が含まれている場合)、したがって、構築後に新しいオブジェクトがいくつかの集合的制約を満たすことを確認する1つのアトミック操作の一部としてオブジェクトを作成すると便利だと最近検討しました。 これを行うには、複数のオブジェクトを作成できるコンストラクターを用意します。次に、プログラマーはすべてのコードを単一のコンストラクターに配置し、オブジェクトo 1、...、o nが作成されると、それらが必要なすべての制約を満たすようにします(たとえば、新しいオブジェクト間のすべてのリンクが既に配置されています)。私は そのような機能について聞いたことがなかったので、私は集合コンストラクターという用語を自分で作り上げましたが、この概念の受け入れられた名前がおそらく存在するかもしれません。 では、この種のコンストラクタをサポートするプログラミング言語はありますか?そうでない場合、アイデアはすでに試されていますか?

2
Ruby-メソッド間でインスタンス変数とパラメーターを使用する場合
他のメソッドを呼び出すメソッドをいくつか書いています。 情報を渡すには、いくつかの選択肢があります。 情報をパラメーターとして渡す 他のメソッドがインスタンス変数にアクセスできるようにインスタンス変数を設定します どちらのオプションをいつ選択すればよいですか? 渡されるものについて非常に具体的であるため、最初のオプションは良いようです。欠点は、多くの値が渡されていることです。 2番目の方法はすべての値を渡す必要はありませんが、メソッドがインスタンス変数を「どこかに」設定するという多くの魔法につながるようです クラス内の他のメソッドに渡されることについて常に明示する必要がありますか?例外はありますか?

2
OOP言語のモジュールシステム
シンプルなオブジェクト指向プログラミング言語を設計しています。 これは、Javaと同様に、VMによって静的に型付け、コンパイル、および実行されます。 違いは、OOPをそれほど強調したくないということです。コード自体はほとんどC ++(ファイルスコープで許可されているクラス、関数、変数)に似ています。 必要なものの1つはモジュールシステムです。私は以下を理解しました: すべてのファイルはモジュールです(一度コンパイルすると)-Pythonのように プログラマーはimportキーワードを使用してモジュールをインポートする必要があります。これにより、コンパイラーは標準ディレクトリーおよびファイル・ディレクトリーでモジュールを検索します(VMは実行時にもこれを行う必要があります)。 そして今、私はサブモジュールとモジュール階層の概念をどのように導入すればよいのか分かりません。 たとえば、1つのオプションは、ディレクトリ階層に依存することです。これによりimport engine.graphics.renderer、作業ディレクトリ内、および「renderer」というモジュールを持つ「graphics」というディレクトリ内に「engine」というディレクトリが見つかるはずです。 そのようなデザインの欠点は何ですか?何か不足していますか?

3
パブリックプロパティとパブリックフィールドの使用
私が作業している場所では、プロパティの使用はお勧めできません。「スピードアップ」するコード生成ツールがあります。すべてのオブジェクトデータはパブリックフィールドになります。とにかくプロパティをリクエストすると、次のようになります。 Public sFoo as String Public Property Foo as String Get Return sFoo End Get Set(ByVal value as String) sFoo = value End Set End Property これを行うための合理的な議論は考えられません。パブリックプロパティとパブリックフィールドの両方を使用する正当な理由はありますか?

3
「列挙可能」とはどういう意味ですか?
私の数学のバックグラウンドは非常に貧弱です(つまり、最後に行われた関連する数学のクラスは2年前に高校の三角法でした-別の時代の別の話)。私は「Javascript:The Definitive Guide」を読んでいますが、それは繰り返し使用されている用語であり、私はそれをちょっと試してみました。しかし、私は章(第6章-オブジェクト)に来ました。プログラミング/ OOPでの用語とそのアプリケーションの理解の欠如が学習プロセスに有害になり始めています。オンライン辞書は役に立たないので、誰かが説明しやすい定義や例を示していますか?

3
例外をスローしないトライアンドキャッチは条件付きよりも効率的ですか?
私は最近この例に出くわしました: 1,000回のうち999回の例外がスローされない場合、例外は1回だけ生成されます。一方、条件文は不必要に999回呼び出されているため、この場合は例外が優先されます。 このインスタンスではC#ですが、一般的に言ってこれは本当ですか?以前は、try / catchステートメントには、条件の処理に費やされる時間と同じ独自のオーバーヘッドがあると想定していました。 確かに、通常は条件付きの場所にtry / catchブロックを投げるだけでコードを書くのはひどい方法ですが、リソースの観点からこのステートメントは成り立ちますか?

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