Eldeki görev, Java web uygulamamın bir parçasını oluşturmaktır; bu, küçük kod parçalarını kompozisyonsal bir şekilde kolayca yürütmeme olanak tanır. Eldeki görev, kullanıcının herhangi bir sırada "eylemleri" oluşturmasına izin vermektir. Benim mücadele ettiğim şey, parametreleri eylemlerime geçirmektir.Temiz programlama uygulamalarını korurken genel bir eylem sınıfı nasıl tasarlanır?
Tüm eylem arayüzü ile başlar:
eylem çözülenepublic interface Action {
void resolve(Context context);
}
, bu kodu yürütüldüğünde bu. Kod herhangi bir şey olabilir: Java'da bir yöntemi çağırmak, bazı Javascript yürütmek ...
Burada, "bağlam" benim için sorun. Her eylem belirli bir bağlam içinde yürütülür. Buradaki fikir, eylemi oluşturan kullanıcının kavramdan hangi nesnenin alınacağını, örneğin mevcut eylemi çözen kullanıcının veya eylemin özel arayüzünde belirtilen diğer nesneleri belirtebilmesidir.
Örnek, hadi bu eylemin bakalım:
public final class ActionScript implements Action {
private final Parameters parameters;
private final String methodName;
private final ScriptsLibrary library;
public ActionScript(ScriptsLibrary library, String methodName, Parameters parameters) {
this.parameters = parameters;
this.library = library;
this.methodName = methodName;
}
@Override
public void resolve(Context context) {
try {
((Invocable) library.getEngine()).invokeFunction(methodName, context);
} catch (ScriptException | NoSuchMethodException ex) {
throw new RuntimeException(ex);
}
}
}
O Gergedan kullanarak JavaScript bir eylem çağrısında basit sarıcı var. parametreler herhangi bir şey olabilir: Yani
public class DummyAction implements Action {
@Override
public void resolve(Context context) {
User userExecutingTheAction = context.get("ExecutingUser");
System.out.println("User " + userExecutingTheAction);
}
}
: DB belirli kimlikleri ile nesneler, int/Dizi/boole değerleri bir işlemden kaynaklanan
kod şöyle olabilir ... kullanıcı tarafından yapılandırılan eylem çalışma zamanı parametrelerini (örn: eylemi yürüten kullanıcı ...) ve statik parametreleri (eylem yüklendiğinde oluşturulan - örneğin bir yapılandırma dosyasından) ve tüm bu kavramdan alabilir. Ayrıca, kullanıcı, örneğin çalışma zamanında enjekte edilecek parametrelerdeki nesneye referanslar belirleyebilir. Tam kompozisyona ulaşmak için iç içe/dekore edilebilir. Örneğin: Bu veriyor
public class DummyWrapperAction implements Action {
private final Action wrappedAction;
public DummyWrapperAction(Action wrappedAction) {
this.wrappedAction = wrappedAction;
}
@Override
public void resolve(Context context) {
System.out.println("Before");
wrappedAction.resolve(context);
System.out.println("After");
}
}
eylemleri kolaylıkla oluşturulacak:
// executes specific action 1 or specific action 2 based on a condition
Action myAction = new LoggingAction(new ConditionalAction(new Condition(3), new SpecificAction1(), new SpecificAction2()));
tüm Bunu bilen bağlam sınıfını tasarlamak için en temiz kuyu nedir? Birkaç parçaya bölünmeli mi? Mücadele, çalışma zamanında sınıf için gereken her şeyi enjekte etmek ve potansiyel sarılmış eylemlerle çatışmamak için emin olun.
- bir işlem tutma eylemi geliştiricilerin statik parametreler sağlayan ve kullanıcı kaynaşma
- o erişim sağlayarak
- zamanında DB'den herhangi bir nesne alma:
Bağlam temel uygulama sorumludur çalışma zamanı ve statik kavram ve bu bir sarıcıda bile (ör: bir üst eylem bir alt eylemi çağırırsa, eylemi yürüten kullanıcısı hala bilinmelidir; dolayısıyla bağlam statik çocuk parametrelerini birleştirmeli ve çalıştırılmalıdır. gibi zaman parametreleri
Çok fazla uğraştığını hissediyorum.Tasarım, çok sorumluluklara sahip olan Kavram sınıflarından etkilenir ve bunların parçalanması gerekir (şu anda uygulamanın her parçası, konseptle bağlantılıdır). Ama nasıl ? Statik mekanizmaların
- : Burada temiz kodlama başarmayı denemek ne
Nesne yönelimli ve yöntem odaklı bir şekilde, bu belirli tasarım sorununu nasıl çözebilirim?
düzenleme: arayüzünde yöntemde kamu Bildiricisi kaldırıldı
düzenleme 2: Ben ilginç çözümlere bir sürü vardı, ama bana daha mantıklı birer eylem belirli bir ile parametrelenmişse edildiği biriydi Bağlam türü.
- Eylem arayüzü eylem olduğunda eylemlerin
- statik parametreler yüklenir, bunlar DB olmak ya da başka olabilir, bağlam ile harekete çözmek için, yine de yalnızca bir yöntemi vardır: Ben gibi şeyler yeniden
- bağlam eylem
Biraz soru sormayı basitleştirir misiniz? İçeri girmesi biraz fazla olduğu için. –
Elbette! Eylem arabirimi, Bağlam nesnesinin çok fazla olan nesnesine dayanır. İçerik, eylemi gerçekleştiren kullanıcı gibi nesneleri alabilen eylem tasarımcılarına bir hizmet sağlar. Bağlamı parçalara ayırmalı mıyım? Yoksa genel tasarımda özlediğim bir şey mi? – MMacphail
Şimdi sorunuzu daha net görmeye başlıyorum. Sorunun 'Context' nesnesi ise, belki de [ChangeListener] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ChangeListener.html) arabirimini uygulamak yerine 'Eylem' arayüzü. Kendi benzer 'İçerik 'nesnesine sahip ve' Eylem 'dinleyicinizle aynı şeyi yapıyor gibi görünüyor? –