0

ライブラリからメソッドを呼び出すときは、その名前が意味することを正確に実行することを期待します。

Connection c = driver.getConnection();
  1. つながりを返す
  2. 失敗した場合にエラーを報告する
  3. 期待以上のことをしない

「ライブラリコード」を書くとき、デカップリング、凝集、抽象化の原則に固執するのは非常に簡単です。これらを守らないことは、ほとんどの場合、設計上のエラーを意味します。

しかし、ビジネス ロジックの場合、いくつかの問題が発生し、おそらく視点を変更する必要があります。ビジネス ロジック レベルでは、次のように言います。

session.connect(); //session is of Session type, my "business logic class"

構成ファイルを読み取り、見つからない場合はデフォルトを使用し、接続し、チェックを行い、ユーザーに通知する必要がある警告を決定します。たとえば、データベースのバージョンがクライアントよりも古いという事実です。ソフトウェア。

メソッドはまとまりがなければならないので、これらすべてを行うべきではないと言い、これを厳密に適用すると、1 行だけの connect メソッドになってしまいます。

 public class Session {
        ...
        Connection c;
        public void connect() {
             c = driver.getConnection();
        }      
 }

つまりconnect、ビジネス クラス Session のメソッドは、基になるクラスに折りたたまれます。

そして、残りのタスクは?ファイルを読んで、データベースのバージョンなどを確認しますか?

ビジネスコードをすべてのロジックを実行する「大きなメソッド」に延期しています。

そして、これはまさに私のポイントです。

ビジネス ロジックのコンテキストで結合と分離の原則を適用すると、タスクを小さなサブタスクに細分化することができず、すべての作業を行う大きな "モノリシック" メソッドがいくつかあり、読みにくくなります。

低レベルのライブラリ (Driver.getConnection()) の優れた原則 (結束、抽象化) は、ビジネス ロジックにはまったく不十分です。

私のアイデアは次のとおりです。

  1. 結束は、まったく新しい概念に置き換えなければなりません
  2. 結束は特定のポイントまで「引き伸ばされる」必要があります

そして、私は2番目が好きなので、私の質問はその点は何ですか.

4

2 に答える 2

1

そして、私は2番目が好きなので、私の質問はその点は何ですか。

私はこれが意味のある方法で答えられるとは思わない。

@Erhanの回答が指摘しているように、凝集度と結合度は、他の測定値や設計の原則(OOなど)と「緊張関係にある」測定値です。常識を無視して、これらの対策を単独で最大化/最小化しようとすると、コードが読み取れなくなります。

IMOの最善のアプローチは、コードを読みやすく、設計を理解しやすくするための直感を身に付けることです。さまざまな対策に注意を払ってください。ただし、それらがあなたの直感と矛盾する場合は、それらを無視する準備をしてください。直感が正しいかどうかわからない場合は、経験豊富な開発者に作業のレビューを依頼してください。

「優れた設計」や「ベストプラクティス」と同様に、さまざまな測定値(凝集度、結合度、複雑さ、テストカバレッジ)は経験的なものであることを常に忘れないでください。彼らはあなたが解決しようとしている問題の現実を無視します。あなたの判断を考えたり使用したりしないための言い訳としてそれらを使用しないでください。

于 2011-05-29T23:51:56.667 に答える
1

OOP の概念と優れた設計の一部が欠けていると思います。Martin Fowler が言ったように、コードの匂いがする場合、コードがもう読めない場合は、結合を増やしたり結合を減らしたりしようとしたためです (結合を %0 に削除したり、結合を 100% まで上げたりすることはできません。これを試すと、上記の connect() の例のようなコードが得られます)、間違った方向に進んでいます。なぜなら、これらの概念はコードを読みやすくするためにあるからです。結束を高めるための「抽出方法」のようなリファクタリングの概念もあります。Cohesion と Coupling は、通常、形容詞「低結合」および「高結合」と一緒に使用されます。設計者がそれを決定/最適化する必要があります。ちなみに、session.connect() を呼び出す場合、接続を構成する必要はないと思います。これをする、

于 2011-05-29T22:37:36.997 に答える