Zaczynam projekt grupy szkolnej w Javie, używając Swinga. Jest to prosty GUI w aplikacji komputerowej Database.
Profesor dał nam kod zeszłorocznego projektu, abyśmy mogli zobaczyć, jak on to robi. Moje pierwsze wrażenie jest takie, że kod jest o wiele bardziej skomplikowany, niż powinien być, ale wyobrażam sobie, że programiści często myślą to, patrząc na kod, którego nie napisali.
Mam nadzieję znaleźć powody, dla których jego system jest dobry lub zły. (Zapytałem profesora, a on powiedział, że później zobaczę, dlaczego jest lepiej, co mnie nie satysfakcjonuje).
Zasadniczo, aby uniknąć sprzężenia jego trwałych obiektów, modeli (logiki biznesowej) i widoków, wszystko odbywa się za pomocą łańcuchów. Trwałymi obiektami, które są przechowywane w bazie danych, są tablice skrótów ciągów, a modele i widoki „subskrybują się”, zapewniając klucze łańcuchów dla „zdarzeń”, które subskrybują.
Po uruchomieniu zdarzenia widok lub model wysyła ciąg znaków do wszystkich swoich subskrybentów, którzy decydują, co zrobić dla tego zdarzenia. Na przykład w jednej z metod detektora akcji widoków (uważam, że ustawia to właściwość bicycleMakeField na obiekcie trwałym):
else if(evt.getSource() == bicycleMakeField)
{
myRegistry.updateSubscribers("BicycleMake", bicycleMakeField.getText());
}
To wywołanie ostatecznie trafia do tej metody w modelu pojazdu:
public void stateChangeRequest(String key, Object value) {
... bunch of else ifs ...
else
if (key.equals("BicycleMake") == true)
{
... do stuff ...
Profesor mówi, że ten sposób robienia rzeczy jest bardziej rozszerzalny i łatwiejszy w utrzymaniu niż widok wywołujący metodę na obiekcie logiki biznesowej. Mówi, że nie ma sprzężenia między poglądami a modelami, ponieważ nie znają się nawzajem.
Myślę, że jest to gorszy rodzaj sprzężenia, ponieważ widok i model muszą używać tych samych ciągów, aby działać. Jeśli usuniesz widok lub model lub popełnisz literówkę w ciągu, nie wystąpią błędy kompilacji. Dzięki temu kod jest o wiele dłuższy niż myślę, że powinien.
Chcę z nim o tym porozmawiać, ale wykorzystuje swoje doświadczenie branżowe, aby odeprzeć wszelkie argumenty, które ja, niedoświadczony student, mogę wysunąć. Czy jego podejście nie ma żadnej przewagi?
Aby to wyjaśnić, chcę porównać powyższe podejście, mając widok oczywiście połączony z modelem. Na przykład możesz przekazać obiekt modelu pojazdu do widoku, a następnie zmienić „markę” pojazdu, wykonaj następujące czynności:
vehicle.make = bicycleMakeField.getText();
Zmniejszyłoby to 15 wierszy kodu, które są obecnie WYŁĄCZNIE używane do ustawienia marki pojazdu w jednym miejscu, do jednego czytelnego wiersza kodu. (A ponieważ tego rodzaju operacje są wykonywane setki razy w całej aplikacji, myślę, że byłoby to duże zwycięstwo zarówno pod względem czytelności, jak i bezpieczeństwa.)
Aktualizacja
Mój lider zespołu i ja zrestrukturyzowaliśmy ramy w taki sposób, w jaki chcieliśmy to zrobić, używając pisania statycznego, poinformowaliśmy profesora i ostatecznie daliśmy mu wersję demonstracyjną. Jest wystarczająco hojny, aby pozwolić nam korzystać z naszego frameworka, dopóki nie poprosimy go o pomoc, i jeśli uda nam się przyspieszyć resztę naszego zespołu - co wydaje nam się sprawiedliwe.