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

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

3
モックコンクリートクラス-非推奨
私は、「Growing Object-Oriented Software」の本の抜粋を読んだところです。これは、具象クラスのモックが推奨されない理由を説明しています。 以下に、MusicCentreクラスの単体テストのサンプルコードを示します。 public class MusicCentreTest { @Test public void startsCdPlayerAtTimeRequested() { final MutableTime scheduledTime = new MutableTime(); CdPlayer player = new CdPlayer() { @Override public void scheduleToStartAt(Time startTime) { scheduledTime.set(startTime); } } MusicCentre centre = new MusicCentre(player); centre.startMediaAt(LATER); assertEquals(LATER, scheduledTime.get()); } } そして彼の最初の説明: このアプローチの問題は、オブジェクト間の関係が暗黙的に残されることです。モックオブジェクトを使用したテスト駆動開発の目的は、オブジェクト間の関係を発見することであることを明確にしたことを願っています。サブクラスを作成する場合、ドメインコードにはそのような関係を表示するものはなく、オブジェクトのメソッドだけです。これにより、この関係をサポートするサービスが他の場所に関連しているかどうかを確認するのが難しくなり、次回クラスで作業するときに分析をやり直す必要があります。 彼が言うとき、彼が何を意味するのか正確に理解することはできません。 これにより、この関係をサポートするサービスが他の場所に関連しているかどうかを確認するのが難しくなり、次回クラスで作業するときに分析をやり直す必要があります。 サービスはMusicCentreのメソッドに対応することを理解していますstartMediaAt。 「他の場所」とはどういう意味ですか? …

12
Fortran 77のみでコーディングされている人にオブジェクト指向プログラミングを説明するにはどうすればよいですか?
私の母はFortranで大学の論文を書いており、現在(10年以上後)流体シミュレーションのためにc ++を学ぶ必要があります。彼女はすべての手続き型プログラミングを理解できますが、オブジェクトを説明しようとしても、それは固執しません。(私はJavaで多くの仕事をしているので、オブジェクトがどのように機能するかを知っています)私はそれをあまりにも高レベルの方法で説明しているかもしれないと思うので、まったく一緒に仕事をしたことがなく、成長した人には本当に意味がありません純粋に手続き型プログラミングの時代に。 彼女が理解するのに役立つ簡単な方法を彼女に説明できますか?

5
Liskov Substitution Principleは、IntrospectionまたはDuck Typingと互換性がありませんか?
アヒル型言語で通常行われているように、オブジェクトを自分自身で検査できる言語では、リスコフ置換原理を遵守できないことを正しく理解できますか? 例えば、Rubyで、クラスの場合B、クラスから継承Aし、すべてのオブジェクトのためxのA、x.class返すために起こっているAが、場合xの目的はB、x.class返却するつもりはありませんA。 LSPの声明は次のとおりです。 ましょうQ(x)はオブジェクトに関するプロパティ証明可能であるxは型のT。次いで、Q(y)は、オブジェクトのために証明可能であるべきであるY型のS Sは、のサブタイプであるT。 たとえば、Rubyでは、 class T; end class S < T; end プロパティq(x) =で見られるように、この形式のLSPに違反していますx.class.name == 'T' 添加。答えが「はい」(イントロスペクションとLSPの互換性がない)の場合、私の他の質問は次のようになります。性質。 更新。参考のために、ウェブで見つけたLSPの別の定式化を以下に示します。 基本クラスへのポインターまたは参照を使用する関数は、知らないうちに派生クラスのオブジェクトを使用できる必要があります。 そしてもう一つ: SがTの宣言されたサブタイプである場合、タイプSのオブジェクトは、タイプTのオブジェクトとして扱われる場合、タイプTのオブジェクトとして動作するはずです。 最後のものには次の注釈が付いています。 LSPはすべて、オブジェクトの予期される動作に関するものであることに注意してください。オブジェクトの予想される動作が明確である場合にのみ、LSPを追跡できます。 これは元のものよりも弱いようで、観察できるかもしれませんが、それが形式化されること、特に予想される動作を誰が決めるかを説明したいと思います。 LSPはプログラミング言語のクラスのペアのプロパティではなく、クラスのペアと特定のプロパティのセットのプロパティであり、祖先クラスによって満たされていますか?実際には、これは、LSPを尊重するサブクラス(子孫クラス)を構築するために、祖先クラスの考えられるすべての使用法を知っている必要があることを意味しますか?LSPによると、先祖クラスは任意の子孫クラスに置き換えられるはずですよね? 更新。 私はすでに答えを受け入れましたが、質問を説明するためにRubyからもう1つの具体例を追加したいと思います。Rubyでは、クラスはClassクラスの子孫であるという意味で、各クラスはモジュールですModule。しかしながら: class C; end C.is_a?(Module) # => true C.class # => Class Class.superclass # => Module module M; end M.class # => …

9
使用するOOデザイン(デザインパターンはありますか?)
「バー/クラブ」(あなたが飲む/社交する場所)を表す2つのオブジェクトがあります。 あるシナリオでは、バーの名前、住所、距離、スローガンが必要です 別のシナリオでは、バー名、住所、ウェブサイトのURL、ロゴが必要です したがって、同じものを表すが異なるフィールドを持つ2つのオブジェクトがあります。 不変オブジェクトを使用するのが好きなので、すべてのフィールドはconstructorから設定されます。 1つのオプションは、2つのコンストラクターを持ち、他のフィールドをヌルにすることです。 class Bar { private final String name; private final Distance distance; private final Url url; public Bar(String name, Distance distance){ this.name = name; this.distance = distance; this.url = null; } public Bar(String name, Url url){ this.name = name; this.distance = null; this.url = url; …

5
なぜサービス指向の言語がないのですか?
編集: さらなる混乱を避けるために:私はウェブサービスなどについて話していません。内部でアプリケーションを構造化することについて話しているのですが、それはコンピューターの通信方法についてではありません。プログラミング言語、コンパイラー、および命令型プログラミングパラダイムの拡張方法についてです。 元の: 命令型プログラミングの分野では、過去20年(またはそれ以上)に2つのパラダイムがありました。オブジェクト指向(OO)とサービス指向(SO)です。コンポーネントベース(CB)。 両方のパラダイムは、モジュールの独自の概念を導入することにより、命令型プログラミングパラダイムを拡張します。OOはそれらをオブジェクト(およびクラス)と呼び、データ(フィールド)とプロシージャ(メソッド)の両方を一緒にカプセル化します。SOは対照的に、データ(レコード、Beanなど)をコード(コンポーネント、サービス)から分離します。 ただし、Smalltalk、C ++、Javaおよびその他すべてのJVM互換、C#およびその他すべての.NET互換、Pythonなど、そのパラダイムをネイティブにサポートするプログラミング言語を持っているのはOOのみです。 SOにはそのような母国語はありません。COM / DCOM(バイナリ、C、C ++)、CORBA、EJB、Spring、Guice(すべてJava)などの手続き型言語またはオブジェクト指向言語の上にのみ存在します。 これらのSOフレームワークは、その概念のネイティブ言語サポートが欠落していることは明らかです。 OOクラスを使用して、サービスとレコードを表し始めます。これにより、メソッドのみ(サービス)を持つクラスとフィールドのみ(レコード)を持つクラスが明確に区別される設計になります。サービスまたはレコード間の継承は、クラスの継承によってシミュレートされます。技術的には、厳密に保持されていませんが、一般的に、プログラマーは2つの役割のうちの1つだけを行うようにクラスを作成することをお勧めします。 追加の外部言語を使用して、欠落している部分を表現します。IDL、XML構成、Javaコードの注釈、またはGuiceのような埋め込みDSLです。サービスの構成はサービスコード自体の一部ではないため、これは特に必要ですが、これに限定されません。OOでは、オブジェクトは他のオブジェクトを作成するため、そのような機能は必要ありませんが、SOでは他のサービスをインスタンス化または構成しないためです。 それらは、プログラマーがSOを「駆動」するために必要なすべてのコードを書かなければならないOO(初期のEJB、CORBA)の上に内部プラットフォーム効果を確立します。クラスはサービスの性質の一部にすぎず、多くのクラスを作成して一緒にサービスを形成する必要があります。プログラマーのためにそれを行うSOコンパイラーがないため、そのすべてのボイラープレートが必要です。これは、一部の人々がC ++が存在しないときにOO for Cでそれを行ったのと同じです。オブジェクトのデータを保持するレコードを、メソッドであるプロシージャの最初のパラメーターとして渡すだけです。OO言語では、このパラメーターは暗黙的であり、コンパイラーは仮想関数などに必要なすべてのコードを生成します。SOの場合、これは明らかに欠落しています。 特に、新しいフレームワークでは、AOPまたはイントロスペクションを使用して、欠落している部分をオブジェクト指向言語に追加しています。これは、必要な言語表現力をもたらしませんが、前のポイントで説明したボイラープラットフォームコードを避けます。 一部のフレームワークは、コード生成を使用してボイラープレートコードを生成します。XMLの構成ファイルまたはOOコードの注釈は、このための情報源です。 上記のすべての現象がSOに起因するとは限りませんが、SO言語が必要であることを明確に示すことを望みます。このパラダイムは非常に人気があるため、なぜ存在しないのですか?または、学術的なものもあるかもしれませんが、少なくとも業界では使用していません。

5
私のクラスが本のクラスの階層よりも悪いのはなぜですか(初心者OOP)?
PHPオブジェクト、パターン、およびプラクティスを読んでいます。著者は大学での授業をモデル化しようとしています。目標は、レッスンタイプ(講義またはセミナー)と、レッスンが時間制レッスンか固定価格レッスンかに応じて、レッスンの料金を出力することです。したがって、出力は次のようになります Lesson charge 20. Charge type: hourly rate. Lesson type: seminar. Lesson charge 30. Charge type: fixed rate. Lesson type: lecture. 入力が次の場合: $lessons[] = new Lesson('hourly rate', 4, 'seminar'); $lessons[] = new Lesson('fixed rate', null, 'lecture'); 私はこれを書いた: class Lesson { private $chargeType; private $duration; private $lessonType; public function __construct($chargeType, $duration, …

3
汎用プログラミング、業界で使用される頻度
現在、アカデミックな環境でプログラミングを行っているので、好きなものを使用できます。ブーストグラフライブラリをいくつかの目的に使用していますが、GPをより深く理解するための努力に投資する価値があるかどうか疑問に思っています。 私は興味があります-ジェネリックプログラミング(GP)は業界で多く使用されていますか?私の推測では、ほとんどのプログラマーはOOPにはるかに慣れているか、GPを強調またはサポートしていない言語を使用しているため、C ++でSTLデータ構造/関数を呼び出す以外に、GPはそれほど頻繁に使用されないという印象です実際には。しかし、現時点では業界の外にいるので、これについて実務家から聞いてうれしいです。 (私がこれを書いているとき、ジェネリックプログラミングは有効なタグではないことがわかりました!)

7
設計の観点から、ロギングのベストプラクティスは何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 現在作業中のアプリケーションにロギングを追加したい。以前にロギングを追加しましたが、ここでは問題ではありません。 しかし、オブジェクト指向言語の設計の観点から、OOPとパターンに従うロギングのベストプラクティスは何ですか? 注:私は現在C#でこれを行っているので、C#の例は明らかに歓迎されています。また、JavaとRubyの例をご覧ください。 編集:私はlog4netを使用しています。プラグインするのに最適な方法がわからないだけです。

4
PHPでオブジェクト指向の方法でデータを渡すにはどうすればよいですか?
MVCフレームワーク(CodeIgniterなど)で作業しているときでも、オブジェクトではなくネストされた配列を渡すことに定期的に頼っています。 これは、オブジェクト指向についての私の理解にうまく従いません。たとえば、コードをJavaに移植する場合、そのような配列(またはベクターなど)を渡すことを夢見ていません。 これがデータを処理する適切な方法かどうか疑問に思っていました。PHPで配列がこのように渡される理由、またはオブジェクトが使用されない理由はありますか?データを渡す最良の方法は何ですか?

4
動的で弱く型付けされた言語では、デザインパターンとOOPプラクティスに関する考え方がどのように変わりますか?
これらの線に沿ってすでにかなり役立つ質問があります(「非OOPデザインパターン?」)が、動的で型付けの弱い言語を始めたばかりの人の移行の観点について、私はもっと興味があります。 つまり、C ++、C#、またはJavaで長年プログラミングしており、GoFデザインパターン、エンタープライズアプリケーションアーキテクチャのファウラーパターン、SOLID原則などに沿って多くの知恵を吸収したとしましょう。 m Ruby、Python、JavaScriptなどに手を出し、自分の知識がどのように適用されるのか疑問に思う。おそらく私は多くの場合に直接翻訳を行うことができますが、ほとんど確実にそれは私の新しい設定を十分に活用していないでしょう。アヒルのタイピングだけでも、私のインターフェースベースの考え方の多くが頭に浮かびます。 何が変わりませんか?何が変わりますか?動的言語初心者が知っておくべき、SOLIDや標準パターン(おそらくまったく新しいパターン)などの基本原則はありますか?

7
構造化プログラミングとオブジェクト指向プログラミング
私は構造プログラミングとオブジェクト指向プログラミングの違いを示すプレゼンテーションを行っていますが、OOPの概念を適用することでコーディングが非常に簡単になり、OOPが本当に必要であると視聴者に感じられる例を挙げて、人々がOOPを必要とする理由を説明したいと思います。 何か案は ??

5
オープンクローズド原則の利点を活用していますか?
Open-Closed Principle(OCP)は、オブジェクトは拡張のために開かれ、修正のために閉じられるべきであると述べています。私はそれを理解し、SRPと組み合わせて使用​​して、たった1つのことを行うクラスを作成すると信じています。そして、すべての動作コントロールをサブクラスで拡張またはオーバーライドできるメソッドに抽出できるようにする多くの小さなメソッドを作成しようとしています。したがって、依存関係の注入と構成、イベント、委任など、多くの拡張ポイントを持つクラスになります。 次の単純で拡張可能なクラスを考えてください。 class PaycheckCalculator { // ... protected decimal GetOvertimeFactor() { return 2.0M; } } たとえば、OvertimeFactor1.5に変更するとします。上記のクラスは拡張するように設計されているため、簡単にサブクラス化して別のを返すことができますOvertimeFactor。 しかし ... ...クラスは拡張用に設計され、OCPに準拠していますが、問題のメソッドをサブクラス化およびオーバーライドしてからIoCコンテナー内のオブジェクトを再配線するのではなく、問題のメソッドを変更します。 その結果、OCPが達成しようとしていることの一部に違反しました。上記の方法は少し簡単なので、怠けているように感じます。OCPを誤解していますか?私は本当に何か違うことをするべきですか?OCPのメリットをさまざまに活用していますか? 更新:回答に基づいて、この人為的な例は、いくつかの異なる理由で貧弱な例のように見えます。この例の主な目的は、オーバーライドされると、内部コードまたはプライベートコードを変更せずにパブリックメソッドの動作を変更するメソッドを提供することにより、クラスが拡張されるように設計されたことを示すことでした。それでも、私は間違いなくOCPを誤解していました。

4
ネストされたクラス:便利なツールまたはカプセル化違反?
だから、私はこれらを使用すべきかどうかについて、まだフェンスの上にいます。 カプセル化の極端な違反を感じますが、コードの柔軟性を高めながら、ある程度のカプセル化を達成できることがわかりました。 以前のJava / Swingプロジェクトでは、ネストされたクラスをある程度使用していましたが、C#で他のプロジェクトに移動したため、使用を避けています。 ネストされたクラスについてどう思いますか?

10
オブジェクト指向の設計スキルをどのように評価しますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 どのような洞察や質問があなたの人のOOADスキルを決定するのにつながるでしょう。

2
DDDの例外
私はDDDを学んでいて、特定の状況で例外をスローすることを考えています。私はオブジェクトが悪い状態に入ることができないことを理解しているので、ここで例外は問題ありませんが、多くの例では、たとえば、データベースに電子メールが存在する新しいユーザーを追加しようとした場合にも例外がスローされます。 public function doIt(UserData $userData) { $user = $this->userRepository->byEmail($userData->email()); if ($user) { throw new UserAlreadyExistsException(); } $this->userRepository->add( new User( $userData->email(), $userData->password() ) ); } したがって、この電子メールを持つユーザーが存在する場合、アプリケーションサービスで例外をキャッチできますが、try-catchブロックを使用してアプリケーションの操作を制御するべきではありません。 これに最適な方法は何ですか?

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