web-dev-qa-db-ja.com

クラスに多くのコンストラクターを与え、それらを介してできるだけ多くのプロパティを割り当てます

SQLiteトリガーを表すクラスを作成しました。

    public SQLiteTrigger(string Name, 
                         string On, 
                         TriggerStartType StartType, 
                         TriggerEventType EventType) : this(...)

    public SQLiteTrigger(string Name, 
                         string On, 
                         TriggerStartType StartType,  
                         TriggerEventType EventType, 
                         string TriggerSQL) : this(...)

    public SQLiteTrigger(string Name, 
                         string On, 
                         TriggerStartType StartType, 
                         TriggerEventType EventType, 
                         string TriggerSQL, 
                         string When)

より多くのパラメーターを持つコンストラクターをさらに追加することを考えているので、ほぼすべてのトリガー作成が1つのライナーになる可能性があります。クラスに多くのコンストラクターを与え、それらを介してできるだけ多くのプロパティを割り当てる場合、それは設計ルールに反するのでしょうか、それとも悪い習慣と見なされるのでしょうか。

ここでビルダーパターンを提案しているすべての人に反応している間、すみません:

これはC#であり、Javaではありません。

Joshua Blochのビルダーパターン の主な理由は、Javaの名前付き引数の欠如をハックすることです。これにより、Java悪を回避する方法 コンストラクタパターンのテレスコープ が得られます。

あなたはC#にいます。 引数に名前を付けました!

Joshua Blochのビルダーパターン のもう1つの理由は、必須の引数をオプションの引数(適切なデフォルト値を持つ引数)から分離し、オプションの引数の任意の組み合わせを設定できるようにするためです。 Javaはオプションの引数をネイティブにサポートしていないため、これが必要です。

あなたはC#にいます。 オプションの引数があります!

つまり、リストした3つのコンストラクターを1つだけに置き換える必要があります。

public SQLiteTrigger(
    string Name, 
    string On, 
    TriggerStartType StartType, 
    TriggerEventType EventType, 
    string TriggerSQL = "some default string", 
    string When = "some other default string"
)

そして今、以前とは異なり、クライアントはWhenをいじることなくTriggerSQLを変更できます。

new SQLiteTrigger(
    Name: "MyTrigger", 
    On: "Whatever", 
    StartType: new TriggerStartType(),
    EventType: new TriggerEventType(),
    When: "Now"
)

Blochビルダーと比較すると、これは

  • クライアント(人間)が使いやすい
  • 実装が簡単
  • 柔軟なデザイン

誤解しないでください、私はBlochビルダーが大好きです。 Javaの場合。それらを必要としない言語でハッキーな回避策を使用しないでください。

今、あなたは良いスタイルについて尋ねました、そしてあなたはより多くのパラメータを追加することに言及しました。多くに追加するように注意してください。これは アリティ と呼ばれます。あまりにも多くのarityは、基礎となる設計の欠陥を示している可能性のあるコードの臭いです。 風通しを減らすために再設計する方法 があります。

これらの追加パラメーターが単純な必須オプション(よく知られているデフォルト)よりも複雑な場合パターンの場合、Blochビルダーを超えた次のステップに興味があるかもしれません。 DSLビルダー

16
candied_orange

クラスに多くのコンストラクターを与え、それらを介してできるだけ多くのプロパティを割り当てる場合、それは設計ルールに反するのでしょうか、それとも悪い習慣と見なされるのでしょうか。

これは次のように聞こえます:

  1. ビルダーパターン が必要です。ビルダーを実装すると、以前に構築したビルダーで「build()」を繰り返し呼び出し、必要に応じてパラメーターを調整できます。
  2. 非常に多くのプロパティがある場合、クラスはより多くのクラスに分解する必要があり、それぞれに特定の明確な責任がありますか?あなたのクラスがsoの多くのプロパティを持っている場合、それだけでやりすぎているかどうか疑問に思い始めます
0
Brian Agnew

クラスに多くのコンストラクターを与え、それらを介してできるだけ多くのプロパティを割り当てる場合、それは設計ルールに反するのでしょうか、それとも悪い習慣と見なされるのでしょうか。

それを行うのは悪い習慣ではないと思いますが、ここでの本当の質問は、本当に必要かどうかということだと思います。ここに当てはまる可能性のあるソフトウェア開発のYAGNI(You Are n’t Gonna Need It)の原則があります。本当に必要なことだけを実行し、これまたは将来役立つ可能性があると考えるのをやめる必要があります。

少し前に書いたこの小さな記事を読んでください。自分で決定を下すのに少し役立つかもしれません: KISS、YAGNI&DRY、開発者としての生活を簡素化する3つの原則

0
Elwi