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

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

4
「変化するものをカプセル化する」と言うとき、それはどういう意味ですか?
私が出会ったOOP原則の1つは次のとおりです。-さまざまなものをカプセル化します。 私はフレーズの文字通りの意味が何であるかを理解しています。しかし、私はそれがより良いデザインにどの程度貢献するのかわかりません。誰かが良い例を使って説明できますか?

5
ゲッターを使用して定数を回避するのは良い習慣ですか?
クラスの外部で使用されている定数をゲッターで置き換えるのは良い習慣ですか? 例として、if User.getRole().getCode() == Role.CODE_ADMINまたはを使用する方が良いif User.getRole().isCodeAdmin()でしょうか? それはこのクラスにつながります: class Role { constant CODE_ADMIN = "admin" constant CODE_USER = "user" private code getRoleCode() { return Role.code } isCodeAdmin () { return Role.code == Role.CODE_ADMIN } isCodeUser () { return Role.code == Role.CODE_USER } }

6
インターフェイスに実装の具体的なタイプを定数の形式で返すメソッドを含めることはできますか?
私は非常に頻繁に、異なるインターフェイスの具体的なタイプに依存するコンポーネントの異なる動作が必要な状況に陥ります。 私の質問を説明するために、私が意味することを示す小さなコードを書きました。この例では、動物オブジェクトから食品オブジェクトをインスタンス化しようとしています。 interface Animal { void growl(); String getAnimalType(); //"DOG" or "FISH" } abstract class Food {} Meat extends Food {} Bread extends Food {} class FoodFactory { Food createFoodForAnimal(Animal animal) { switch (animal.getAnimalType()) { case "DOG": Food food = new Meat(); break; case "FISH": Food food = new Bread(); …

4
不変フィールドのセッターを処理するにはどうすればよいですか?
2つのreadonly intフィールドを持つクラスがあります。プロパティとして公開されます: public class Thing { private readonly int _foo, _bar; /// <summary> I AM IMMUTABLE. </summary> public Thing(int foo, int bar) { _foo = foo; _bar = bar; } public int Foo { get { return _foo; } set { } } public int Bar { get { return …

8
順次コレクションは、インデックス0またはインデックス1で開始する必要がありますか?
複数のチャネルを持つデバイスのオブジェクトモデルを作成しています。クライアントと私の間で使用される名詞があるChannelとChannelSet。(「セット」は順序付けられており、適切なセットがそうではないため、意味的に正確ではありません。しかし、それは別の時代の問題です。) C#を使用しています。以下に使用例を示しChannelSetます。 // load a 5-channel ChannelSet ChannelSet channels = ChannelSetFactory.FromFile("some_5_channel_set.json"); Console.Write(channels.Count); // -> 5 foreach (Channel channel in channels) { Console.Write(channel.Average); Console.Write(", "); } // -> 0.3, 0.3, 0.9, 0.1, 0.2 すべてがダンディです。 ただし、クライアントはプログラマーではないため、ゼロインデックスによって完全に混乱します。最初のチャネルはチャネル1です。しかし、C#との一貫性を保つために、ChannelSetインデックスをゼロから維持したいと思います。 これにより、開発チームとクライアントが相互作用するときに、いくつかの切断が確実に発生します。しかし、さらに悪いことに、これがコードベース内でどのように処理されるかに矛盾があると、潜在的な問題になります。たとえば、次のUI画面では、エンドユーザー(1インデックス作成の観点から考える)がチャネル13を編集しています。 そのSaveボタンは、最終的にいくつかのコードになります。ChannelSetインデックスが1の場合: channels.GetChannel(13).SomeProperty = newValue; // notice: 13 または、インデックスがゼロの場合: channels.GetChannel(12).SomeProperty = newValue; // notice: 12 私はこれをどのように扱うか本当によくわかりません。私は、順序付けられた整数インデックス付きのもの(ChannelSet)を、C#ユニバースの他のすべての配列およびリストインターフェイスと一貫性を保つこと(ゼロインデックス付けChannelSet)をお勧めします。しかし、その後、UIとバックエンドの間のすべてのコードには翻訳(1を引く)が必要になります。そして、誰もが陰湿で一般的なオフバイワンエラーが既にどの程度存在するかを知っています。 …


4
Javaが一部のクラスでカプセル化を使用しないのはなぜですか?
私の質問はSystem.inとSystem.outクラスに関連しています(標準ライブラリにあるようなものがあるかもしれません)。何故ですか?それはOOPの悪い習慣ではありませんか?次のように使用しないでください:System.getIn()およびSystem.getOut()?私はいつもこの質問をしてきました。ここで良い答えが見つかることを望みます。

5
共有コーディングパラダイムを使用するという点で、言語Yでプログラムを記述しているように、言語Xで何かを記述するのがなぜ悪いのか[非公開]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 しばらく前に、私はC ++で書かれた何かについてのSOの質問をし、代わりに手で問題に答えを得るための、コメントは、私はそれがあることが示された場合でも、私のコーディングスタイル上のすべての大騒ぎWIPのコードの一部そして、ベースケースを実行させたときに、後でクリーンアップするつもりだった。(私は非常に多くの票を集めたので、私はSOの担当者がすでにほぼ最悪であるため、質問を撤回することにしました) なぜ人々は「あなたは初心者だ、自分で性交をする」という厳しいラインを採用するのだろうと思いました。私は、あたかもJavaであるかのようにC ++を書いていると非難されていました。私が理解できない何か、それでも私を困惑させます。 私は、間隔を置いてではあるが、何年もの間、かなりの数のOOP言語でプログラミングを行ってきました。使用可能なライブラリと、手元のジョブに最適な実行環境の観点から、使用する言語を選択します。私はOOPコードにデザインパターンを採用していますが、パターンの使用は適切であり、オブジェクト指向では賢明であると確信しています。私はOOPツールボックスを理解していますが、コーディングの知恵を示すためにきちんとしたトリックを使用するのではなく、本当に必要だと思うときにのみツールを使用することを選択します。(私が知っているのは一流ではありませんが、n00bレベルでもないと思います)。 1行書く前にコードを設計します。テストを定義するために、特定のクラスの目標と、クラスが順守しなければならないテスト基準をリストします。シーケンス図を作成してコードを書く方が簡単なので、インターフェイスが明らかになった後にテストを書くことにしました。 質問で投稿したコードの一部で、スマートポインターを使用する代わりに、ポインターを使用していることを認めなければなりません。できる限りRAIIを使用しています。適切なRAIIとは、nullpointersに対する保護を意味しますが、徐々に作業を進めます。それは進行中の作業であり、後でクリーンアップするつもりでした。この働き方は強く非難されました。 私の見解では、基本ケースが実行可能な思考方法であるかどうかを確認できるように、最初に実際の例を用意する必要があります。また、ベースケースが証明された後、コードのクリーンアップはアジャイルのリファクタリングフェーズの典型的なことだと思います。私はゆっくりとCxx標準を取得していますが、実稼働コードでまだ習得していない概念を使用するリスクを負うのではなく、理解しているものを使用することを好みます。たまに新しいものを試すこともありますが、通常はその目的のために、私が脇に置いているプレイプロジェクトでやっています。 [編集]質問を始める前に、gnatの提案[1]が検索に表示されなかったことを明確にしたいと思います。ただし、彼の提案は質問の1つの側面をカバーしていますが、彼がリンクした質問は私の質問の核心ではなく、その一部にすぎません。私の質問は、自分のコーディングスタイルに対する応答と、さまざまなコーディングスタイルと(見かけの)レベルのスキルを処理する専門的な側面についてです。SOについての以前の質問と、それが適切な事例としての回答です。[/編集] 質問は次のとおりです。あなたのコーディングスタイルを使用していない人をsc笑するのはなぜですか。 手元にある問題/下位区分は次のとおりです。 リファクタリングにより後で堅牢になった場合、プロトタイプの状況でエラーが発生しやすいコードを使用するのはなぜプログラミングの悪い習慣になるのでしょうか? C ++で書かれたプログラムは、Javaで書かれたようにどのようにできますか?何が悪いプログラムになっているのですか(現在のスタイルの意図と改善する予定の作業を示したと考えていますか?) 特定のプログラミングパラダイム(たとえば、OOP / DP)で使用される構造を使用することを選択した場合、どのように悪い専門家になりますか? [1] 高速でバグのあるものを開発し、エラーを修正するか、コードの各行に注意して遅くしますか?

4
既に存在するオブジェクトに機能を追加するにはどうすればよいですか?
特定の量の明確に定義された機能を備えたインターフェイスがあります。まあ言ってみれば: interface BakeryInterface { public function createCookies(); public function createIceCream(); } これはインターフェイスのほとんどの実装でうまく機能しますが、いくつかのインスタンスでは、いくつかの新しい機能を追加する必要があります(新しいメソッドにロールインするなどcreateBrownies())。これを行うための明白/単純なアプローチは、インターフェースを拡張することです。 interface BrownieBakeryInterface extends BakeryInterface { public function createBrownies(); } しかし、既存のAPIを変更せずに新しい機能を追加できないという点でかなり大きな欠点があります(新しいインターフェイスを使用するようにクラスを変更するなど)。 インスタンス化後に機能を追加するためにアダプターを使用することを考えていました。 class BrownieAdapter { private brownieBakery; public function construct(BakeryInterface bakery) { this->brownieBakery = bakery; } public function createBrownies() { /* ... */ } } これは私に次のようになります: bakery = new …

5
OOPの概念を適用して、シンプルだが実際のWebアプリを構築するにはどうすればよいですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 私は頭をOOPに巻き付けるために長い間努力してきました。その利点がわかります。私は多くのチュートリアルを読み、このテーマについて同量のビデオを見ました。動物/猫/犬の例、車/ドライブの例があります。私が苦労しているのは、これらの概念を実際のアプリケーションに適用する方法です。そこで、OOPを使用してビルドすることにしました。 私は構文の助けを求めたり、特定のコードを書いたりするのではなく、ドキュメントやフォーラムなどを検索することで、自分自身を見つけることができます。私を指導してくれるベテランのプログラマーはいますか? 私の学習プロジェクトとして、シンプルなクラシファイド「ウェブアプリ」を構築したいと思います。Craigslistに似たものですが、範囲の点でかなり落ち着きました。PHP5とMySQLは使い慣れているので、使用したいと思います。 これらの2つのユースケースのみがあるとしましょう: 売り物を投稿する 購入するものを閲覧/検索する オブジェクトとなる「もの」は何ですか?各アイテムがオブジェクトになる可能性があると想像できますが、どの時点でですか?なぜ? たとえば、ユーザーが「販売アイテムを投稿する」フォームに入力すると、そのフォームはオブジェクトに変換され、値をデータベースに挿入する別のオブジェクトに渡されますか? 別のユーザーがカテゴリCのすべてのアイテムを閲覧してリクエストする場合はどうでしょうか?アプリがデータベースに接続する必要があるときはいつでも、データベースオブジェクトを作成し、アイテムオブジェクトの束を取得してページに表示するのは理にかなっていますか?…これを書くことで、OOPについてまだ無知であることを実感できます。それを修正するのを手伝ってください。 あなたの意見で、これがOOPに足を踏み入れるのに適したプロジェクトではない場合、別のアイデアを提案してください。


4
オープン/クローズド原則を明確にする
私がそれを説明したように、オープン/クローズされた原則は、一度書かれたコードは修正されるべきではないと述べています(バグ修正を除く)。しかし、ビジネスルールが変更された場合、それらの変更を実装するコードを変更すべきではありませんか?私はそれが私には意味をなさないので、私は原理がどのようにかについて何かを理解していないと思う。

10
クラスプロパティがクラスの新しいインスタンスを作成して返す場合、それはアンチパターンですか?
私はHeadingいくつかのことを行うと呼ばれるクラスを持っていますが、現在の見出し値の反対を返すこともできるはずであり、Headingクラス自体の新しいインスタンスを作成することで最終的に使用する必要があります。 reciprocal現在の値の反対の見出しを返すために呼び出される単純なプロパティを使用して、Headingクラスの新しいインスタンスを手動で作成するか、HeadingクラスcreateReciprocalHeading()の新しいインスタンスを自動的に作成してそれを返すようなメソッドを作成できますユーザー。 しかし、私の同僚の1だけでクラスを作成するために私をお勧めプロパティと呼ばれるreciprocalそのgetterメソッドを介したクラス自体の新しいインスタンスを返すことを。 私の質問は次のとおりです。クラスのプロパティがそのように動作するのはアンチパターンではありませんか? 私は特に以下の理由で直観的ではないと思います: 私の考えでは、クラスのプロパティはクラスの新しいインスタンスを返すべきではありません。 reciprocalIDEからヘルプを得たり、ゲッター署名を確認したりせずに、プロパティの名前であるが、開発者がその動作を完全に理解するのに役立ちません。 クラスプロパティが何をすべきかについて厳格すぎるのですか、それとも有効な懸念事項ですか?私は常にフィールドとプロパティを介してクラスの状態を管理しようとし、メソッドを介してその動作を管理しようとしましたが、これがクラスプロパティの定義にどのように適合するかはわかりません。

5
明示的なキャスト演算子の使用は合理的ですか、それとも悪いハックですか?
私には大きなオブジェクトがあります: class BigObject{ public int Id {get;set;} public string FieldA {get;set;} // ... public string FieldZ {get;set;} } そして、特殊なDTOのよ​​うなオブジェクト: class SmallObject{ public int Id {get;set;} public EnumType Type {get;set;} public string FieldC {get;set;} public string FieldN {get;set;} } 個人的には、BigObjectをSmallObjectに明示的にキャストするという概念を見つけます-それは一方向のデータ損失操作であることを知っている-非常に直感的で読みやすいです: var small = (SmallObject) bigOne; passSmallObjectToSomeone(small); 明示的な演算子を使用して実装されます: public static explicit operator …

10
OOPで循環参照が必要と思われるこの実世界のアクティビティをモデル化する適切な方法は何ですか?
私は循環参照に関するJavaプロジェクトの問題に取り組んできました。私は、問題のオブジェクトが相互に依存しており、お互いについて知る必要があると思われる現実の状況をモデル化しようとしています。 このプロジェクトは、ボードゲームをプレイする一般的なモデルです。基本クラスは非特定ですが、チェス、バックギャモン、その他のゲームの特定に対処するために拡張されています。11年前、これを6種類のゲームを備えたアプレットとしてコーディングしましたが、問題は循環参照でいっぱいだということです。当時、私は単一のソースファイルにすべての絡み合ったクラスを詰め込むことでそれを実装しましたが、私はそれがJavaでは悪い形であるという考えを得る。ここで、Androidアプリと同様のものを実装し、適切に処理したいと考えています。 クラスは次のとおりです。 RuleBook:ボードの初期レイアウト、最初に移動した人などのその他の初期ゲームの状態情報、利用可能な移動、提案された移動後のゲームの状態に何が起こるか、などの評価などについて質問できるオブジェクト現在または提案されている取締役会の位置。 ボード:ゲームボードの単純な表現で、移動を反映するように指示できます。 MoveList:Moveのリスト。これは、特定のポイントで利用可能な動きの選択、またはゲーム内で行われた動きのリストの2つの目的です。それは2つのほぼ同一のクラスに分割できますが、それは私が尋ねている質問とは関係がなく、さらに複雑になるかもしれません。 移動:1回の移動。移動に関するすべてが原子のリストとして含まれています。ここからピースを拾い、そこに置き、そこからキャプチャしたピースを削除します。 状態:進行中のゲームの完全な状態情報。ボードの位置だけでなく、MoveList、および現在誰が移動するかなどの他の状態情報。チェスでは、各プレイヤーのキングとルークが移動したかどうかを記録します。 循環参照はたくさんあります。たとえば、RuleBookは特定の時間にどの動きが利用可能かを判断するためにゲームの状態を知る必要がありますが、ゲームの状態は最初の開始レイアウトと1回の動きに伴う副作用についてRuleBookに問い合わせる必要がありますそれが行われます(たとえば、次に移動する人)。 新しいクラスのセットを階層的に整理してみました。RuleBookはすべてを知る必要があるため、最上位にあります。しかし、これにより、多くのメソッドをRuleBookクラスに移動する(移動するなど)必要があり、モノリシックになり、RuleBookがどうあるべきかを特に表しません。 これを整理する適切な方法は何ですか?RuleBookをBigClassThatDoesAlmostEverythingInTheGameに変換して、循環参照を回避し、実際のゲームを正確にモデル化する試みを放棄する必要がありますか?または、相互に依存するクラスに固執し、コンパイラーに何らかの方法でそれらをコンパイルさせ、実世界のモデルを保持する必要がありますか?または、私が欠落している明らかな有効な構造がありますか? あなたが与えることができる助けをありがとう!

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