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

オブジェクト指向設計とは、ソフトウェアの問題を解決するために、相互作用するオブジェクトのシステムを計画するプロセスです。

4
プライベートゲッターではなくパブリックファイターを使用する
ほとんどの不変のPOJOは次のように書かれています: public class MyObject { private final String foo; private final int bar; public MyObject(String foo, int bar) { this.foo = foo; this.bar = bar; } public String getFoo() { return foo; } public int getBar() { return bar; } } しかし、私は次のようにそれらを書く傾向があります。 public class MyObject { public final String foo; …

7
セッターのチェインが型破りなのはなぜですか?
Beanにチェーンを実装すると非常に便利です。コンストラクター、メガコンストラクター、ファクトリーをオーバーロードする必要がなく、読みやすさが向上します。オブジェクトを不変にしたい場合を除き、欠点は考えられません。その場合、とにかくセッターはありません。これがOOPの慣例ではない理由はありますか? public class DTO { private String foo; private String bar; public String getFoo() { return foo; } public String getBar() { return bar; } public DTO setFoo(String foo) { this.foo = foo; return this; } public DTO setBar(String bar) { this.bar = bar; return this; } } //...// DTO …

4
例外の伝播:例外をキャッチするタイミング
MethodAはMethodBを呼び出し、MethodBはMethodCを呼び出します。 MethodBまたはMethodCには例外処理はありません。ただし、MethodAには例外処理があります。 MethodCでは、例外が発生します。 現在、この例外はMethodAにバブリングされており、適切に処理されます。 これの何が問題になっていますか? 私の考えでは、ある時点で呼び出し元がMethodBまたはMethodCを実行し、それらのメソッドで例外が発生した場合、それらのメソッド内で例外を処理することで得られるものは、本質的にletではなくtry / catch / finallyブロックですそれらは呼び出し先までバブルアップしますか? 例外処理に関するステートメントまたはコンセンサスは、それだけで実行が継続できない場合にスローすることです-例外。わかった。しかし、try / catchブロックを完全にダウンさせるのではなく、チェーンのさらに上で例外をキャッチしてください。 リソースを解放する必要があるときに理解しています。それはまったく別の問題です。

3
MVCデザインのどこにビジネスロジックを配置しますか?
データフォームを介してデータベースにレコードを追加する簡単なMVC Javaアプリケーションを作成しました。 私のアプリはデータを収集し、検証して保存します。これは、データがさまざまなユーザーからオンラインで調達されているためです。データは本質的にほとんど数値です。 データベース(SQLサーバー)に格納されている数値データで、計算を実行して結果を表示するアプリを作成します。ユーザーは計算の実行方法に関心がないため、カプセル化する必要があります。ユーザーは、単純な計算データ(たとえば、A列データからB列データをC列データで除算したもの)のみを表示できる必要があります。同じストアドプロシージャを記述する方法は知っていますが、3層アプリが必要です。 データベースにレコードとして入れて、計算を実行して処理したデータが必要です。元のデータは影響を受けないまま、計算後の新しいデータは新しいエンティティレコードとしてデータベースに保存する必要があります。 このバックグラウンド計算用のコードはどこに書くべきですか?ルールとビジネスロジックなので、新しいJavaBeansファイルに入れる必要がありますか?

10
単体テストは設計をどのように促進しますか?
私たちの同僚は、ユニットテストの作成を、実際に設計を改良し、リファクタリングするのに役立つものとして推進していますが、その方法はわかりません。CSVファイルを読み込んで解析する場合、ユニットテスト(フィールドの値の検証)は設計の検証にどのように役立ちますか?彼は結合やモジュール性などに言及しましたが、私にはあまり意味がありません-しかし、私は理論的な背景があまりありません。 それはあなたが重複とマークした質問と同じではありません。私は、「それが役立つ」という理論だけでなく、これがどのように役立つかの実際の例に興味があります。私は以下の回答とコメントが好きですが、もっと学びたいです。

8
何も表さないクラス-それは正しいですか?
アプリケーションを設計しているだけで、SOLIDとOOPを正しく理解しているかどうかはわかりません。クラスは1つのことを実行し、適切に実行する必要がありますが、一方で、クラスは実際のオブジェクトを表します。 私の場合、データセットで特徴抽出を行い、機械学習分析を行います。私は3つのクラスを作成できると思います FeatureExtractor データセット アナライザ しかし、FeatureExtractorクラスは何も表さず、クラスというよりもルーチンのようなものにします。使用される関数はextract_features()1つだけです。 一つのことではなく一つのことを表すクラスを作成するのは正しいですか? 編集:それが重要かどうかはわかりませんが、私はPythonを使用しています そして、extract_features()がそのように見える場合:そのメソッドを保持する特別なクラスを作成する価値はありますか? def extract_features(df): extr = PhrasesExtractor() extr.build_vocabulary(df["Text"].tolist()) sent = SentimentAnalyser() sent.load() df = add_features(df, extr.features) df = mark_features(df, extr.extract_features) df = drop_infrequent_features(df) df = another_processing1(df) df = another_processing2(df) df = another_processing3(df) df = set_sentiment(df, sent.get_sentiment) return df

9
インターフェースを将来使用するためのプログラミング
次のようなインターフェイスを設計した同僚が隣に座っています。 public interface IEventGetter { public List<FooType> getFooList(String fooName, Date start, Date end) throws Exception; .... } 問題は、現時点では、この「end」パラメーターをコードのどこにも使用していないことです。将来的に使用する必要があるため、そこにあるだけです。 現在、役に立たないインターフェースにパラメーターを入れるのは悪い考えだと彼に納得させようとしていますが、「終了」日付の使用をいつか実装すると、多くの作業が必要になると主張し続けます。その後、すべてのコードを適応させる必要があります。 さて、私の質問は、「尊敬される」コーディングの達人のようなトピックを扱っているソースはありますか?

6
関数が複雑で変数が多い場合、クラスを作成する必要がありますか?
オブジェクト指向プログラミング(OOP)は、たとえばPythonとは異なり、ファーストクラスの機能を持たないJavaとは異なるため、この質問は多少言語に依存しませんが、完全ではありません。 言い換えれば、Javaのような言語で不必要なクラスを作成することに対する罪悪感は減りますが、Pythonのような定型的でない言語にはもっと良い方法があるかもしれないと感じています。 私のプログラムは、比較的複雑な操作を何度も行う必要があります。その操作には多くの「ブックキーピング」が必要であり、いくつかの一時ファイルを作成および削除する必要があります。 そのため、他の多くの「サブオペレーション」も呼び出す必要があります。すべてを1つの巨大なメソッドに入れるのは、あまり良くなく、モジュール式で、読みやすいなどではありません。 今、これらは私の頭に浮かぶアプローチです: 1.パブリックメソッドを1つだけ持つクラスを作成し、そのインスタンス変数にサブ操作に必要な内部状態を保持します。 次のようになります。 class Thing: def __init__(self, var1, var2): self.var1 = var1 self.var2 = var2 self.var3 = [] def the_public_method(self, param1, param2): self.var4 = param1 self.var5 = param2 self.var6 = param1 + param2 * self.var1 self.__suboperation1() self.__suboperation2() self.__suboperation3() def __suboperation1(self): # Do something with self.var1, self.var2, …

5
関数をパラメーターとして他の関数に渡しますか?
AS3アプリケーションとバックエンドとの通信方法を変更するプロセスを進めており、RESTシステムを実装して古いシステムを置き換えるプロセスを進めています。 悲しいことに、作業を開始した開発者は現在、長期の病気休暇中であり、私に引き継がれています。私は過去1週間かそこらでこれを使って作業しており、システムを理解していますが、心配していることが1つあります。関数の関数への受け渡しが多いようです。たとえば、サーバーへの呼び出しを行うクラスは、プロセスが完了してエラーが処理されたときにオブジェクトを呼び出して渡す関数を受け取ります。 それは恐ろしい練習であると感じる「悪い気持ち」を与えてくれます。そして、いくつかの理由を考えることができますが、システムにやり直しを提案する前に確認が必要です。この問題の経験がある人はいないだろうか?

6
Java継承の「拡張」を避ける理由
ジェイム・ゴスリングは言った 「可能な限り、実装の継承を避ける必要があります。」 代わりに、インターフェイスの継承を使用します。 しかし、なぜ?キーワード "extends"を使用してオブジェクトの構造を継承しないようにし、同時にコードをオブジェクト指向にする方法はありますか? 「書店で本を注文する」などのシナリオで、この概念を示すオブジェクト指向の例を教えてください。

5
クラスを継承し、プロパティを追加しないのはなぜですか?
私たちの(かなり大きな)コードベースで、次のような継承ツリーを見つけました。 public class NamedEntity { public int Id { get; set; } public string Name { get; set; } } public class OrderDateInfo : NamedEntity { } 私が集めることができるものから、これは主にフロントエンドでのものをバインドするために使用されます。 私にとっては、genericに依存するのではなく、クラスに具体的な名前を付けるため、これは理にかなっていますNamedEntity。一方、追加のプロパティを持たないクラスは数多くあります。 このアプローチには欠点がありますか?

13
ブール値パラメーターを使用して値を決定するのは間違っていますか?
動作を決定するためにブール値パラメーターを使用するのは間違っていますか?、ブールパラメータを使用して動作を決定することを避けることの重要性を知っています。たとえば: 元のバージョン public void setState(boolean flag){ if(flag){ a(); }else{ b(); } c(); } 新しいバージョン: public void setStateTrue(){ a(); c(); } public void setStateFalse(){ b(); c(); } しかし、動作の代わりにブール値パラメーターを使用して値を決定する場合はどうでしょうか?例えば: public void setHint(boolean isHintOn){ this.layer1.visible=isHintOn; this.layer2.visible=!isHintOn; this.layer3.visible=isHintOn; } 私はisHintOnフラグを削除し、2つの別個の関数を作成しようとしています。 public void setHintOn(){ this.layer1.visible=true; this.layer2.visible=false; this.layer3.visible=true; } public void setHintOff(){ this.layer1.visible=false; this.layer2.visible=true; this.layer3.visible=false; } …

9
オブジェクト指向コードを書くとき、私は常にデザインパターンに従うべきですか?
オブジェクト指向プログラムに考えられる設計パターンはありますか?これは、最近、のDoorクラスの実装を見たためですLock。これはテストの一部であり、答えは、コードがNull Objectパターンに従っていることです。 class Lock { public: virtual void close() = 0; virtual void open() = 0; virtual bool is_open() const = 0; virtual ~Lock() { } }; class DummyLock : public Lock { private: DummyLock(); DummyLock(const DummyLock&) = delete; DummyLock& operator=(const DummyLock&) = delete; private: void close() { } void …

8
OOPは簡単になりますか、難しくなりますか?[閉まっている]
オブジェクト指向プログラミングの概念が何年も前にプログラマーに紹介されたとき、それは興味深く見え、プログラミングはよりきれいになりました。OOPはこんな感じでした Stock stock = new Stock(); stock.addItem(item); stock.removeItem(item); わかりやすい名前を付けるとわかりやすくなりました。 しかし、データ転送オブジェクト、値オブジェクト、リポジトリ、依存性注入などのパターンを持つOOPは、より複雑になりました。上記を実現するには、いくつかのクラス(例:抽象、ファクトリ、DAOなど)を作成し、いくつかのインターフェイスを実装する必要があります。 注:コラボレーション、テスト、統合を容易にするベストプラクティスに反対するわけではありません

6
オブジェクトのモックが難しいシステムをテストするにはどうすればよいですか?
私は次のシステムで作業しています: Network Data Feed -> Third Party Nio Library -> My Objects via adapter pattern 最近、使用しているライブラリのバージョンを更新したときに問題が発生しました。これにより、とりわけ、タイムスタンプ(サードパーティライブラリがとして返すlong)がエポック後のミリ秒からエポック後のナノ秒に変更されました。 問題: サードパーティのライブラリのオブジェクトを模擬するテストを作成する場合、サードパーティのライブラリのオブジェクトについて間違えた場合、テストは間違っています。たとえば、タイムスタンプの精度が変更され、モックが間違ったデータを返したため、ユニットテストを変更する必要があることに気づきませんでした。これはライブラリのバグではありません。ドキュメントの何かを見逃したために発生しました。 問題は、実際のデータフィードがないと実際のデータ構造を生成できないため、これらのデータ構造に含まれるデータについて確信を持てないことです。これらのオブジェクトは大きくて複雑で、多くの異なるデータが含まれています。サードパーティライブラリのドキュメントは貧弱です。 質問: この動作をテストするためにテストを設定するにはどうすればよいですか?テスト自体は簡単に間違っている可能性があるため、この問題を単体テストで解決できるかどうかはわかりません。さらに、統合システムは大きく複雑であり、見落としがちです。たとえば、上記の状況では、タイムスタンプの処理をいくつかの場所で正しく調整していましたが、そのうちの1つが見つかりませんでした。システムはほとんど統合テストで正しいことを行っているように見えましたが、本番環境(より多くのデータがある)に展開すると、問題が明らかになりました。 現在、統合テストのプロセスがありません。テストは基本的に、ユニットテストを適切な状態に保ち、問題が発生したときにさらにテストを追加し、テストサーバーに展開して問題が正しかったことを確認してから、運用環境に展開します。モックが間違って作成されたため、このタイムスタンプの問題は単体テストに合格し、すぐに明らかな問題を引き起こさなかったため統合テストに合格しました。QA部門がありません。

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