1

結果を返す代わりに、オブジェクトを受け取り、メソッド内でそのオブジェクトの属性を設定するメソッドを使用するのは良いことですか?

結果を返すために、いくつかの違いがある 2 つの類似したメソッドが必要になる場合があります。

技術的には、「コードの重複」は必要なく、より高速に実行できますが、結果が返されない場合、コードは明確ではないと思います。

HTML アナライザーの例:

void parseLinks(Page page){
    //processing
    page.setLinks(links);
    page.setEmails(emails);
    //page.set...;
}

また

List<Link> getLinks(SomeParameter parameter){
    //same processing
    return links;
}

List<Email> getEmails(SomeParameter parameter){
    //same processing
    return emails;
}

page.setLinks(getLinks(parameter));
page.setEmails(getEmails(parameter));
//page.set...
4

4 に答える 4

3

ドメイン オブジェクトを何らかの方法で変更するメソッドと、ドメイン オブジェクトを変更しないメソッドを明確に区別することをお勧めします。使用する一部のメソッドが副作用を生成しないことがわかっていると、複雑なシステム内で作業する方が簡単です (一般的に言えば、コンピューター サイエンスでは、オブジェクトの状態を変更するすべてのメソッドに副作用がないわけではありません)。

プログラムのロジックを可能な限り関数に配置します。これは、目に見える副作用のない結果を返す操作です。コマンド (監視可能な状態を変更するメソッド) を、ドメイン情報を返さない非常に単純な操作に厳密に分離します。責任に適合する概念が提示されたときに、複雑なロジックを VALUE OBJECTS に移動することで、副作用をさらに制御します。

(ドメイン駆動設計: ソフトウェアの中心にある複雑さへの取り組み、Eric Evans)

于 2012-04-05T11:16:11.197 に答える
1

呼び出し先が何らかの作業を行った後、メソッドの呼び出し元が何らかの情報を必要としていると強く感じますか?

はいの場合は、何かを返す必要があります。

*unit testing will be easy if callee returns something*
于 2012-04-05T10:56:24.023 に答える
0

あなたの例は、OOPではなく関数プログラミングのように見えます。parseLinks は Page クラスのメソッドである必要があり、「この」インスタンスで機能する必要があります。さらに、任意のページで何らかの方法で実行する場合は、コンストラクターで実行することをお勧めします。実行後、getLinks と getEmails は、このオブジェクトの通常の getter メソッドのように見えます。

これがこの例での見方ですが、実際には何をしたいかによって異なります。

OK、質問にいくつかのコンテキストを追加すると、理解が深まりました。 次のように実装します。解析メソッドでは、新しいPage インスタンスを返します (クローンを使用するか、新しいインスタンスを構築するメソッドに適切なパラメーターを追加します)。 )、そのフィールドを 1 つずつオンに設定します。このようなもの:

Page parse(String content){
    Page page = new Page()
    //processing
    page.setLinks(getLinks(content));
    page.setEmails(getEmails(content));
    //page.set...;
}
于 2012-04-05T11:04:30.540 に答える
0

オブジェクト データはカプセル化されます。コード内のどこでオブジェクトと対話するかは問題ではありません。

乾杯

于 2012-04-05T10:48:30.223 に答える