全体的なSOLIDプログラミング作業の一環として、ベースフレームワークAPI内にファクトリインターフェイスと抽象ファクトリを作成しました。
人々はすでにファクトリーのCreateメソッドをオーバーロードし始めています。問題は、人々がCreateメソッドにモデルプロパティをオーバーロードしていることです(したがって、ファクトリがそれらを設定することを期待しています)。
私の意見では、プロパティの設定は工場で行うべきではありません。私が間違っている?
public interface IFactory
{
I Create<C, I>();
I Create<C, I>(long id); //<--- I feel doing this is incorrect
IFactoryTransformer Transformer { get; }
IFactoryDataAccessor DataAccessor { get; }
IFactoryValidator Validator { get; }
}
更新-SOLIDの原則に慣れていない人のために、以下にいくつかを示します。
単一責任の原則
すべてのオブジェクトが単一の責任を持つべきであり、その責任はクラスによって完全にカプセル化されるべきであると述べています
オープン/クローズ
の原則
この原則の意味は、アプリケーションに追加する必要のある機能のリクエストを取得したときに、サブクラスと新しい実装を追加するだけで、古いクラスを変更せずに処理できるようにする必要があるということです。
依存性逆転の原則
これは、ソフトウェアモジュールを分離する必要があることを示しています。これを実現するには、依存関係を分離する必要があります。
全体的に:
私は答えを知っていると90%確信しています。ただし、すでにSOLIDを使用している方からの良い議論をお願いします。貴重なご意見ありがとうございました。
更新-では、SOLIDファクトリは何をすべきだと思いますか?
IMHO SOLIDファクトリは、適切なオブジェクトインスタンスを提供します...しかし、オブジェクトインスタンス化の複雑さを隠す方法で提供します。たとえば、従業員モデルがある場合は、工場に適切なモデルを入手するように依頼します。DataAccessorFactoryは正しいデータアクセスオブジェクトを提供し、ValidatorFactoryは正しい検証オブジェクトを提供します。
例えば:
var employee = Factory.Create<ExxonMobilEmployee, IEmployee>();
var dataAccessorLdap = Factory.DataAccessor.Create<LDAP, IEmployee>();
var dataAccessorSqlServer = Factory.DataAccessor.Create<SqlServer, IEmployee>();
var validator = Factory.Validator.Create<ExxonMobilEmployee, IEmployee>();
さらに例をとると...
var audit = new Framework.Audit(); // Or have the factory hand it to you
var result = new Framework.Result(); // Or have the factory hand it to you
// Save your AuditInfo
audit.username = 'prisonerzero';
// Get from LDAP (example only)
employee.Id = 10;
result = dataAccessorLdap.Get(employee, audit);
employee = result.Instance; // All operations use the same Result object
// Update model
employee.FirstName = 'Scooby'
employee.LastName = 'Doo'
// Validate
result = validator.Validate(employee);
// Save to SQL
if(result.HasErrors)
dataAccessorSqlServer.Add(employee, audit);
更新-では、なぜ私はこの分離に固執するのですか?
責任を分離することで、オブジェクトが小さくなり、単体テストが小さくなり、信頼性とメンテナンスが向上すると思います。より多くのオブジェクトを作成することを犠牲にしてそうすることを認識しています...しかし、それがSOLID Factoryが私を保護するものです...それは、前述のオブジェクトの収集とインスタンス化の複雑さを隠します。