Sorumluluk paylaşıldığında tek sorumluluk nasıl yönetilir?


10

İki temel sınıfım var Operationve Trigger. Her birinin belirli işlem veya tetikleyici türlerinde uzmanlaşmış bir dizi alt sınıfı vardır. A Triggerbelirli bir şeyi tetikleyebilir Operation. Iken Operationbelirli bir tarafından tetiklenebilir Trigger.

OperationBelirli bir Trigger(veya tam tersi) verilen bir eşler kodunu yazmak gerekir , ama nereye koymak emin değilim.

Bu durumda kod açıkça bir sınıfa veya diğer sınıfa ait değildir. Tek sorumluluk ilkesi açısından, kodun nereye ait olması gerektiğinden emin değilim.

Hepsi işe yarayacak üç seçenek görebiliyorum. 1 ve 2 sadece bir anlambilim seçeneği gibi görünse de, 3 tamamen farklı bir yaklaşımı temsil eder.

  1. Tetikleyicide, örn bool Triggers(Operation o).
  2. Operasyon hakkında, ör bool TriggeredBy(Trigger t).
  3. Haritalamayı yöneten tamamen yeni bir sınıfta, ör bool MappingExists(Trigger t, Operation o).

Tek bir sorumluluk ilkesine göre paylaşılan harita kodunun nereye yerleştirileceğine nasıl karar vermeliyim?

Sorumluluk paylaşıldığında tek sorumluluk nasıl yönetilir?


Düzenle 1.

Yani asıl kod şuna benzer. Tüm özellikleri vardır ya bir string, Guid, collection<string>, veya enum. Temelde sadece küçük veri parçalarını temsil ederler.

resim açıklamasını buraya girin

Düzenle 2.

Bool dönüş tipinin nedeni. Başka bir sınıf bir koleksiyon Triggerve bir koleksiyon tüketecek Operation. A Triggerve an arasında bir eşlemenin nerede olduğunu bilmek gerekir Operation. Rapor oluşturmak için bu bilgileri kullanacaktır.


Neden bool tipi?
Tulains Córdova

@ user61852 arama koduna sonuç döndürmek için
James Wood

1
Arama kodu boole ile ne yapıyor? Bu soruya verdiğiniz cevaba bağlı olarak çözüm bulabilirim.
Tulains Córdova

@ user61852, lütfen düzenlemelerime bakın.
James Wood

1
Peki, operasyonun tetikleyicisini gerçekten çalıştırmakla hiçbir ilgisi yok mu?
Tulains Córdova

Yanıtlar:


4

Bu şekilde düşünürdüm: Hangi Operasyonun hangi Tetikleyicinin tetiklenmesine neden olduğu nasıl belirlenir. Zamanla değişebilen veya birden fazla algoritmaya dönüşebilen bir algoritma olmalıdır. Trigger veya Operation sınıflarına koymak, bu sınıfların gelecekte bu tür senaryoları işleyebileceğini ima eder. Bir haritalama kadar basit görmüyorum, çünkü daha fazlası olabilir.

Seçimim GetOperationForTrigger (Tetikleyici t) gibi uygun yöntemlerle bir sınıf oluşturmak olacaktır. Bu, kodun seçimi çalışma zamanına veya diğer değişkenlere (ör. Strateji modeli) bağlı olabilen bir dizi sınıfa dönüşmesine izin verir.

Bu düşünme çizgisindeki ana varsayımın minimum kod yazmak (yani bugün üç sınıf) olduğunu, ancak işlevin gelecekte her zaman tam olarak tek bir yol olacağı varsayımını yerine getirmeyecek şekilde genişletilmesi gerektiğinde büyük yeniden düzenlemeden kaçınmak olduğunu unutmayın. Hangi Tetikleyicinin hangi Operasyona neden olduğunu belirler.

Bu yardımcı olur umarım. Yanıt user61852 ile benzer olsa da, muhakeme farklıdır. Sonuç olarak, uygulama farklı olacaktır (yani eşitleri geçersiz kılmak yerine açık yöntemlere sahiptir, bu nedenle yöntem sayısı ihtiyaçlara göre zaman içinde gelişebilir).


5

Orada bulundum, bitti.

Seçenek # 3.

Hangi dili kullanacağınızı bilmiyorum ama Java'ya çok benzeyen bir sahte kod kullanacağım. Diliniz C # ise, muhtemelen benzer arayüzlere ve yapılara sahipsiniz.

Bir Mapping sınıfına veya arayüzüne sahip olun:

public interface Mapping {
    public void setObject1(Object o);
    public void setObject2(Object o);
    public Object getObjecto1();
    public Object getObjecto2();
}
  • Geçersiz Kıl equals()yöntemini Mappingkoleksiyonları böylece Mappingsordu edilebilir onlar belirli bir eşleme mı içereceğini.
  • Özelleşmiş nesnelerin de adecuate equals()yöntemleri olmalıdır .
  • Ayrıca arayüzü uygulayarak Comparableraporları sıralayabilirsiniz.

Bir koleksiyona basitçe bir eşleme koyabilirsiniz

List<Mapping> list = new ArrayList<Mapping>();
Hat hat = new Hat();
Bag bag = new Bag();
list.add(new Mapping(hat,bag));

Daha sonra şunu sorabilirsiniz:

// let's say you have a variable named x which is of type Mapping

if ( list.contains(x) ){
    // do some thing
}

0
  1. Kodunuzu daha küçük parçalara ayırın.

Şu anda A sınıfı B sınıfı ve B sınıfı A sınıfı hakkında bilginiz var.

Tanım gereği A en azından kendi operasyonunu yapıyor VE B'nin çalıştırılıp çalıştırılmayacağını kontrol ediyor. Tersi B ile doğrudur. Hangi sınıf ilk olarak adlandırılırsa, sonuca bakmalı ve başka şeylerin çalıştırılması gerekip gerekmediğini görmelidir.

Sınıflarınızı daha küçük bileşenlere ayırarak bu bağlantıyı kırmaya çalışın. Her sınıfın en tepesine ne yaptığını açık İngilizce olarak açıklamak istiyorum. AND gibi kelimeler kullanmanız gerekiyorsa veya bir veya iki cümlenin üzerinden geçiyorsa, onu parçalamayı düşünmeniz gerekir. Genel bir kural olarak, "ve" işaretinden sonraki her şey kendi sınıfında olmalıdır

Ayrıca Tetikleyici ve Çalıştırma işlevlerini kapsayan bir arabirim tanımlayıp tanımlayamayacağınıza bakın. Eğer bu olamaz başka bir gösterge sınıfınız çok büyüyor. Ayrıca sınıflarınız arasındaki bağlantıyı kıracaktır.


1
Dürüst olmak gerekirse, kodumu daha da bozabileceğimden emin değilim. Görebilmeniz için sorularımı sınıf imzalarıyla güncelledim, ancak temelde her biri birkaç özellik depolayan oldukça hafif veri nesneleri. Birleştirme açısından, evet bu biraz problemlidir, çünkü etkili bir Triggerşekilde a Operation. Ama bu gerçek dünya verisi gibi görünüyor. Birleştirilirler, çünkü bir haritalama vardır, örneğin anlam için birbirlerini bilmeleri gerekir.
James Wood
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.