Tamam .. tüm tartışmalardan sonra, ele aldığım somut bir örneği daha iyi yansıtmak için sorumu biraz değiştiriyorum.
İki sınıf var ModelOne
ve ModelTwo
bu sınıflar benzer işlevsellik gerçekleştirmek ancak birbirleriyle ilgisiz. Ancak CommonFunc
, her ikisinde de uygulanan ModelOne
ve ModelTwo
başına göre çarpan bazı kamu işlevselliği içeren üçüncü bir sınıf var DRY
. İki model ModelMain
sınıf içinde somutlaştırılır (kendisi daha yüksek bir seviyede somutlaştırılır vb. - ama bu seviyede duruyorum).
Kullandığım IoC kapsayıcısı Microsoft Unity . Ben bir uzman gibi davranmıyorum, ama benim anlayış konteyner ile bir dizi arayüzü ve sınıf kayıt olduğunu ve somut bir sınıf istediğinizde IoC konteyner belirli bir arayüzle eşleşen herhangi bir nesne isteyin. Bu, Unity'den örneklemek istediğim her nesne için eşleşen bir arayüz olması gerektiğini ima eder. Sınıflarımın her biri farklı (ve örtüşmeyen) işlevler gerçekleştirdiğinden, arabirim ve sınıf 1 arasında 1: 1 oran olduğu anlamına gelir . Ancak bu, yazdığım her sınıf için körü körüne bir arayüz yazdığım anlamına gelmez.
Böylece kod bilge ben 2 ile bitirmek :
public interface ICommonFunc
{
}
public interface IModelOne
{
ICommonFunc Common { get; }
..
}
public interface IModelTwo
{
ICommonFunc Common { get; }
..
}
public interface IModelMain
{
IModelOne One { get; }
IModelTwo Two { get; }
..
}
public class CommonFunc : ICommonFunc { .. }
public class ModelOne : IModelOne { .. }
public class ModelTwo : IModelTwo { .. }
public class ModelMain : IModelMain { .. }
Soru, çözümümü nasıl organize edeceğimle ilgili. Sınıfı ve arayüzü birlikte tutmalı mıyım? Yoksa sınıfları ve arayüzleri bir arada tutmalı mıyım? ÖRNEĞİN:
Seçenek 1 - Sınıf adına göre düzenlenmiş
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-Main
| |
| |-IModelMain.cs
| |-ModelMain.cs
|
|-One
| |
| |-IModelOne.cs
| |-ModelOne.cs
|
|-Two
|
|-IModelTwo.cs
|-ModelTwo.cs
|
Seçenek 2 - İşlevselliğe göre düzenlenmiştir (çoğunlukla)
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-IModelMain.cs
|-IModelOne.cs
|-IModelTwo.cs
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
Seçenek 3 - Arabirim ve Uygulamayı Ayırma
MySolution
|
|-MyProject
|
|-Interfaces
| |
| |-Models
| | |
| |-Common
| | |-ICommonFunc.cs
| |
| |-IModelMain.cs
| |-IModelOne.cs
| |-IModelTwo.cs
|
|-Classes
|
|-Models
| |
|-Common
| |-CommonFunc.cs
|
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
Seçenek 4 - İşlevselliği daha ileri götürmek
MySolution
|
|-MyProject
| |
|-Models
| |
|-Components
| |
| |-Common
| | |
| | |-CommonFunc.cs
| | |-ICommonFunc.cs
| |
| |-IModelOne.cs
| |-IModelTwo.cs
| |-ModelOne.cs
| |-ModelTwo.cs
|
|-IModelMain.cs
|-ModelMain.cs
|
Yoldaki sınıf adı nedeniyle seçenek 1'i beğenmedim. Ancak IoC seçimim / kullanımım (ve bu tartışmalı olabilir) nedeniyle 1: 1 oranına yöneldiğim için, dosyalar arasındaki ilişkiyi görmede avantajları var.
Seçenek 2 bana çekici geliyor, ama şimdi ModelMain
ve alt modeller arasındaki suları karıştırdım .
Seçenek 3, arayüz tanımını uygulamadan ayırmak için çalışır, ancak şimdi yol adlarında bu yapay aralar var.
Seçenek 4. Seçenek 2'yi aldım ve bileşenleri ana modelden ayırmak için ayarladım.
Birini diğerinden tercih etmek için iyi bir neden var mı? Ya da kaçırdığım diğer potansiyel düzenler?
1. Frank, 1: 1 oranına sahip olmanın C ++ günleri .h ve .cpp dosyalarına geri döndüğünü yorumladı. Nereden geldiğini biliyorum. Birlik anlayışım beni bu köşeye koyuyor gibi görünüyor, ama aynı zamanda bir bakış açısını da izliyorsanız, bundan nasıl çıkacağımdan da emin değilim Program to an interface
.
2. Her nesne yapıcısının ayrıntılarını dışarıda bıraktım. IoC kapsayıcısı gerektiği gibi nesne enjekte eder.
Client1
ihtiyacı olduğunda bir IBase
sağlar Derived1
. İhtiyaç Client2
duyulduğunda IBase
, IoC bir sağlar Derived2
.
interface
. An interface
gerçekten tüm sanal üyeleri olan soyut bir sınıftır.