宣言と実現は、分かれていますか?それとも一緒に置いたほうがいいですか?


昨日からC#を勉强して、自分にC#でアプリケーションを书くように強要しました(もちろん、仕事で必要とされているのではないでしょうか、ただ手を练习しているだけです)、C#の中で、类の声明と実现はいっしょに置かなければならないことを発见して、これは本当に#@¥×&×……
///        
interface ILogger {
void append(string msg);
};

///
class LoggerFactory {
public static ILogger execute() {
// , ,
// Logger LoggerFlatFile

return new LoggerFlatFile();
}
};

/// ILogger ( , )
class LoggerFlatFile : ILogger {
public void append(string msg) {
...
}
};

このような実装を考えると、ログレコーダが必要ですが、実装の詳細をユーザーに知られたくない(後で単例に変更するか、SQLServerデータベースに記録するか、コンソールに印刷するかもしれない)ので、ILoggerインタフェースを設計しました.インタフェースがある以上、このインタフェースを実装する派生クラスのインスタンスを作成する工場が必要です.問題は、工場類の声明と実現は一緒に書かなければならないので、工場類を知っている人は、ロガーFlatFileという具体的な類を知っていて、もともと私はそれを隠したいと思っていました.
今、あるプログラマーの張三がILoggerでログを記録しようとしたと仮定すると、IDEのインテリジェントな感知から、Logger FlatFileというクラスがILoggerから派生してインタフェースを実現したことに気づき、すぐに「ILogger logger=new Logger FlatFile()」と喜んでインスタンスを作成し、満足して使い始めた......Factoryの存在に気づかなかったため、このような結果をもたらした原因は、実は彼の不注意のためではなく、コンパイラが派生類のインスタンスを構築することを予防できなかったからだ.
もう一人のプログラマーの李四は、事前にドキュメントを見て、ILoggerインスタンスを作成するにはLogger Factoryのexecute()という静的な方法を使わなければならないことを知っていたが、ある日、財布をなくして方寸が乱れ、新しいコードを書くときに工場を使うのを忘れ、コンパイルをうまく通過させるnewを書いた.これは彼のせいではなく、コンパイラのせいにするしかない......コンパイラは責任を持って言うだろう.それが見逃したコードは文法に合っていて、本当の元凶は、クラスの設計者であるべきです!
C++であれば、LoggerFlatFileというクラスの宣言と実装をCPPファイルに入れることができます.HファイルにはILoggerとLoggerFactoryの宣言しか入れられません.LoggerFactory::execute()の実装はCPPファイルに入れられています.もう一歩後退します.もし私がHファイルに入れなければ、LoggerFlatFileの構築関数をプライベートにすることができます.同時にLoggerFactoryをその友元にすることができます.
更に工事の構築の上から見ると、1つのHファイルが変わらない限り、そのCPPがどのように変化しても、このHファイルを引用したCPPはすべて再コンパイルする必要はなく、遅いいくつかのコンパイラ(例えばBorland C++Builder)で、かなりの時間を節約した.
私が今見ている「声明と実現を一緒にする」唯一の「メリット」は、「メンテナンスが便利だ」ようだが、本末転倒ではないか.設計者の都合ではなく、利用者がミスを犯さず、ミスを犯さないようにする必要があります.DELPHIでは、DFMファイルごとにPASファイルが対応しています.ASP.NETでは、ASPXファイルごとに1つ対応しています.CSファイルは,VBでも同様であるが,なぜ利用者はメンテナンスが面倒だと感じず,CPPとHの分離だけを指摘するのか.現代のIDEでは、宣言と実装の間にショートカットキーを切り替えたり、マウスをダブルクリックしたりすることは、何が面倒なのでしょうか.(私のVS 2003では、宣言と実装の切り替えはショートカットキーALT+Gです)
実装の詳細を隠すのは、従来はソフトウェア設計の追求であり、typedefも隠蔽の詳細であり、命名定数代替魔数も、クラスのパッケージ、インタフェースの設計など、隠蔽の詳細であり、なぜ私は声明と実装を一緒にしなければならないのだろうか.
BTW:私の親友は何年もこの問題に文句を言ったことがないと言っています.つまり、私一人でJJYYにいるだけで、絶対にRPWT:)