SOLID tasarım ilkelerinde oldukça yeniyim . Sebeplerini ve faydalarını anlıyorum, ancak yine de SOLID ilkelerini kullanmak için pratik bir egzersiz olarak yeniden düzenlemek istediğim daha küçük bir projeye uygulayamıyorum. Mükemmel çalışan bir uygulamayı değiştirmeye gerek olmadığını biliyorum, ancak yine de yeniden düzenlemek istiyorum, böylece gelecekteki projeler için tasarım deneyimi kazanıyorum.
Uygulama aşağıdaki görevi (aslında çok daha fazla ama basit tutalım): Veritabanı Tablosu / Sütun / Görünüm vb tanımları içeren bir XML dosyasını okumak ve oluşturmak için kullanılabilecek bir SQL dosyası oluşturmak zorundadır ORACLE veritabanı şeması.
(Not: Lütfen neden ihtiyacım olduğunu veya neden XSLT'yi kullanmadığımı tartışmaktan kaçının, nedenleri var, ancak konu dışı.)
Başlangıç olarak, yalnızca Tablolara ve Kısıtlamalara bakmayı seçtim. Sütunları görmezden gelirseniz, bunu şu şekilde bildirebilirsiniz:
Kısıtlama, tablonun bir parçasıdır (veya daha kesin olarak CREATE TABLE ifadesinin bir parçasıdır) ve bir kısıtlama başka bir tabloya da başvurabilir.
İlk olarak, uygulamanın şu anda nasıl göründüğünü açıklayacağım (SOLID uygulamadan):
Şu anda, uygulama, tablonun sahip olduğu Kısıtlamalar için bir işaretçi listesi ve bu tabloya başvuran Kısıtlar için bir işaretçi listesi içeren bir "Tablo" sınıfına sahiptir. Bir bağlantı kurulduğunda, geriye doğru bağlantı da kurulacaktır. Tablo, her bir Kısıtlamanın createStatement () işlevini çağıran bir createStatement () yöntemine sahiptir. Bahsedilen yöntem, isimlerini almak için sahip tablosuna ve referans verilen tabloya bağlantıları kullanacaktır.
Açıkçası, bu SOLID için hiç geçerli değildir. Örneğin, gerekli "ekleme" / "kaldır" yöntemleri ve bazı büyük nesne yok ediciler açısından kodu şişiren dairesel bağımlılıklar vardır.
Yani birkaç soru var:
- Dairesel bağımlılıkları Bağımlılık Enjeksiyonu kullanarak çözmeli miyim? Eğer öyleyse, Kısıtlama yapıcı sahibi (ve isteğe bağlı olarak başvurulan) tablo alması gerektiğini varsayalım. Ancak tek bir tablo için kısıtlamaların listesini nasıl aşabilirim?
- Table sınıfı hem kendi durumunu (örn. Tablo adı, tablo yorumu vb.) Hem de Kısıtlama bağlantılarını saklıyorsa, bunlar Tek Sorumluluk İlkesini düşünerek bir veya iki "sorumluluk" mudur?
- Durum 2 doğruysa, sadece bağlantıları yöneten mantıksal iş katmanında yeni bir sınıf oluşturmalı mıyım? Eğer öyleyse, 1. açıkçası artık alakalı olmayacaktır.
- "CreateStatement" yöntemleri Tablo / Kısıtlama sınıflarının parçası mı olmalı yoksa bunları da dışarı taşımalı mıyım? Eğer öyleyse, nereye? Her veri depolama sınıfı için bir Manager sınıfı (yani, Tablo, Kısıtlama, ...)? Ya da bağlantı başına bir yönetici sınıfı oluşturun (3.'ye benzer)?
Bu sorulardan birini cevaplamaya çalıştığımda kendimi bir yerlerde çemberler içinde koşarken buluyorum.
Sütunlar, endeksler vb. Eklerseniz sorun çok daha karmaşık hale gelir, ancak basit Tablo / Kısıtlama şeyiyle bana yardımcı olursanız, belki de geri kalanları kendi başıma halledebilirim.