私は、SOLIDの設計原則にまったく慣れていません。私はそれらの原因と利点を理解していますが、SOLID原則を使用するための実践的な演習としてリファクタリングしたい小規模なプロジェクトにそれらを適用できません。完全に機能するアプリケーションを変更する必要はありませんが、とにかくそれをリファクタリングして、将来のプロジェクトの設計経験を積みたいと思います。
アプリケーションには次のタスクがあります(実際にはそれ以上のことですが、簡単にしましょう):データベーステーブル/列/ビューなどの定義を含むXMLファイルを読み取り、作成するために使用できるSQLファイルを作成する必要がありますORACLEデータベーススキーマ。
(注:なぜそれが必要なのか、なぜXSLTを使用しないのかなどについて議論することは控えてください。理由はありますが、トピックから外れています。)
はじめに、テーブルと制約のみを見ることにしました。列を無視する場合、次のように記述できます。
制約はテーブルの一部(より正確にはCREATE TABLEステートメントの一部)であり、制約は別のテーブルを参照する場合もあります。
最初に、アプリケーションがどのように見えるかを説明します(SOLIDを適用しない):
現時点では、アプリケーションには、テーブルが所有する制約へのポインターのリストと、このテーブルを参照する制約へのポインターのリストを含む「テーブル」クラスがあります。接続が確立されるたびに、逆方向の接続も確立されます。このテーブルには、各制約のcreateStatement()関数を順に呼び出すcreateStatement()メソッドがあります。このメソッド自体は、名前を取得するために所有者テーブルと参照先テーブルへの接続を使用します。
明らかに、これはSOLIDにはまったく適用されません。たとえば、循環的な依存関係があり、必要な「追加」/「削除」メソッドといくつかの大きなオブジェクトデストラクタに関してコードが肥大化しました。
そのため、いくつか質問があります。
- 依存性注入を使用して循環依存関係を解決する必要がありますか?もしそうなら、Constraintはそのコンストラクタで所有者(およびオプションで参照される)テーブルを受け取るべきだと思います。しかし、単一のテーブルの制約のリストをどのように実行できますか?
- Tableクラスが自身の状態(テーブル名、テーブルコメントなど)とConstraintsへのリンクの両方を保存する場合、これらの1つまたは2つの「責任」は、単一責任の原則と考えられますか?
- ケース2.が正しい場合、リンクを管理する論理ビジネスレイヤーに新しいクラスを作成するだけですか?その場合、1は明らかに関連しなくなります。
- 「createStatement」メソッドは、Table / Constraintクラスの一部である必要がありますか、それともそれらを移動する必要がありますか?もしそうなら、どこへ?各データストレージクラス(つまり、テーブル、制約など)ごとに1つのマネージャークラスですか?または、リンクごとにマネージャークラスを作成します(3と同様)。
これらの質問に答えようとするたびに、どこかで輪になって走っています。
列やインデックスなどを含めると、問題は明らかにはるかに複雑になりますが、単純なテーブル/制約のことで手伝ってくれれば、残りは自分で解決できるかもしれません。