オブジェクトをよりスマートに作成する方法

6487 ワード

オブジェクトをよりスマートに作成する方法

클래스 설계의 핵심 과제는 일단 객체를 명확하게 정의된 상태에 두고(초기화/생성),
그 객체의 연산이 수행되는 도중에도 그 상태를 일정하게 유지하며, 
마지막에 그 객체를 소멸시킬 때도 우아하게 마무리 짓는 것이다.

출처 - The C++ Programming Language
オブジェクト向けのプログラミングでは、オブジェクトの作成の開始点をよりインテリジェントにするために、個人的な経験を共有します.
この位置は、インスタンス制御またはオブジェクトの可変コンテンツと比較して、オブジェクト自体の作成に重点を置きます.

1.役割を表します。

정적 팩터리 메서드は生成者に比べて多くの利点がある.
(Effective Javaアイテム1-ジェネレータではなく静的パラメータメソッドを考慮)
その中で最も注目されているのは名前があることです.
これは静的ファクトリメソッドドメインだからです.
したがって、静的ファクトリメソッドを使用してオブジェクトを作成すると、コードの役割を明示的に表すことができます.
// 단순히 생성자를 사용했을 떄 보다
PayHistory payHistory = new PayHistory(orders);

// 정적 팩터리 메서드를 통해 이름을 지정하면 역할을 더 명확히 알 수 있다.
PayHistory payHistory = PayHistory.fromOrders(orders);

2.オブジェクトの作成時にオブジェクトの不変性を保証します。


不変式(invariant)とは、開発者の意図に合致するようにオブジェクトが機能する論理基準を指す.
例えば、LottoNumberというオブジェクトがあり、楽透数字を表すと仮定する.
このLottoNumberに60という数字を入れると、そのオブジェクトの不変式が破られます.
これらのオブジェクトが論理を効率的に実行すると、結果は予測しにくくなります.

public LottoNumber(int number) {
    // 생성자에서 불변식을 보장함으로써 예상치 못한 오작동을 방지할 수 있다.
    if (number > 45) {
        throw new IllegalStateException("로또 숫자가 올바르지 않습니다.");
    }
    ...
}

3.オブジェクトの作成時にステータスを決定します。


オブジェクトを作成するときにステータスを決定する利点は簡単です.
つまり、途中で状態が変わることはありません.これにより、側面視効果を防ぐことができます.
しかし、実際の操作では、オブジェクトの作成時にその状態を完全に特定することは難しい.
したがって、私の場合、オブジェクトを作成するときにできるだけ多くの状態を決定することができます.
できるだけ少なく状態を変えることを妥協点とする.
// 생성 시점에는 상태가 없고, 이후에 상태값이 변한다.
User user = new User();
user.setName("rock");
user.setJob("developer");

// 생성 시점에 상태가 결정된다.
User user = new User("rock", "developer");

4.パラメータはなるべく少なく

The ideal number of arguments for a function is zero.
Next comes one, followed closely by two.
Three arguments should be avoided where possible.

- Clean Code
クリーニングコードでは、パラメータをできるだけ3つ未満に保つ必要があります.この言葉は生成者(または静的工場法)にも適用できると思います.
パラメータが多すぎるジェネレータはエラーが発生しやすく、理解しにくく、再利用しにくい.

5.オブジェクト間の関係を設定する


先日、ウトカンプルーでコードコメントを受けた内容の一つです.

Lottosという名前のオブジェクトを作成する場合は、LottoneyオブジェクトのLottoTicketCountを渡す方法を使用します.
彼らは,Lottmoneyオブジェクトをそのまま相手に渡すと,オブジェクト間の関連関係をよりよく理解できると考えている.
私がlottoTicketCountをジェネレータに渡したのは、intを簡単に受信するジェネレータがより自由に使えると思ったからです.
しかし,コメンテーターが言ったように,オブジェクトをそのまま他人に渡すと,オブジェクトを作成する際に2つのオブジェクトの関係を容易に理解できる.
何が正しいのか、正解はないと思います.
値をコンストラクション関数に渡す方法は一般的かもしれませんが、他のオブジェクトとの関係は特定できません.
オブジェクトを渡す方法は、特定のオブジェクトとの関係を容易に決定できますが、そのオブジェクトと対話するしかありません.

6.オブジェクトを多様化して使用できるようにする。


実は上の質問には答えがあります.(属相?)2つのジェネレータを作成することです!
以前は1つのオブジェクトに生成者が多いのはよくないと考えられていた.
これは,オブジェクトの一貫性を保つことが難しく,オブジェクトの管理が困難であると考えているためである.
しかし、特定の方法でオブジェクトを作成し、一貫性を保つことは意味がありますか?
また、作成者を追加すると、オブジェクトの管理が困難になります.これは、オブジェクトの複雑さや設計エラーを反証していますか?
という考えが生まれた.
特にJabajinが様々な生成者がオブジェクトを広く使えると聞いて考えが一変した.
Java管理者によると、テスト用の作成者のみ、またはオブジェクトの特定のステータス用の作成者のみを作成できます.
ポスト
  • の学習者たちにこの文章を分かち合って、6番の内容に対して多くの悪いところがあって、ほほほ
  • 初めて触れた時はちょっとショック(?)敵もいれば、疑う部分もある.
  • 特に学習では、私がテストで作成したジェネレータが他の人にコードを生産するために使用された場合、危険すぎると考えられています.この言葉は正しいようです.
  • java管理者も、どんな場合でもこのようなジェネレータを作成できるというわけではないかもしれませんが、ジェネレータでオブジェクトを自由に使用できることを強調しています.