witam,
nie
powinniśmy negować każdego pomysłu jaki przedstawia nam Lasu;
sorry, że tak mowie ale narazie zobaczyłem argumenty która
pokazywały co złego taki operator zrobił by z podstawowymi
założeniami paradygmatu obiektowego, ale wracając do realnego
świata;
przykład numer jedne:
mamy zdefiniowanego enuma
który to zawiera pola code i name;
i jeżeli chcemy pobrać
wartość code z niego to musimy za każdym razem sprawdzać czy nie
jest on null;
przykład numer dwa:
sam sun opracował
technologie taka jak jaxb(parsowanie xmla do struktury class) i o to
w tej technologi sun traktuje klasy jako składnice danych gdzie
'olewa' enkapsulację, wiec nie wiem dlaczego nam nie może ułatwić
życia; sama struktura to często po 9 zagnieżdżeń które defakto
wynikają z struktury xml'a;
ps. jeżeli ktoś chce sobie zorbić kuku to wystraczy mu instrukcja przypisania i zorbi sobie kuku;
nie powinniśmy negować każdego pomysłu jaki przedstawia nam Lasu; sorry, że tak mowie ale narazie zobaczyłem argumenty która pokazywały co złego taki operator zrobił by z podstawowymi założeniami paradygmatu obiektowego,
1)
z tego co rozumiem chcesz rozwiązać następujący problem. Masz
zagnieżdżone obiekty i nie chce Ci się pisać kodu sprawdzającego czy
wszystkie elementy po drodze nie są null ale jakby się gdzieś null'ek
zdarzył to nie ma co płakać i ciskać wyjątkami tylko zwrócić takiego
nulka.
Ja spotkałem ten problem przy nietrywialnej logice biznesowej i tzw
anemicznym modelu (czyli POJO zawierające jedynie prywatne pola +
gettery/settery +konstruktory).
Problem z tym sprawdzaniem null'i na każdym poziomie też mnie mocno
spieniał. Tym bardziej, że pojawiał się wielokrotnie.
Może nie najlepszym ale dosyć dobrym rozwiązaniem jest zmusić obiekty
aby na każdym poziomie sprawdzały same czy nie ma null'a.
Oto przykładowe rozwiązanie:
public class Test {
public static class SomeHouse {
private MainEntry mainEntry;
public MainEntry getMainEntry() {
return mainEntry;
}
public void setMainEntry(MainEntry mainEntry) {
this.mainEntry = mainEntry;
}
public LockMode getLockMode() {
if (mainEntry == null)
return null;
return mainEntry.getLockMode();
}
}
public static class MainEntry {
private RealyRealyGoodLock realyRealyGoodLock;
public RealyRealyGoodLock getRealyRealyGoodLock() {
return realyRealyGoodLock;
}
public void setRealyRealyGoodLock(RealyRealyGoodLock realyRealyGoodLock) {
this.realyRealyGoodLock = realyRealyGoodLock;
}
public LockMode getLockMode() {
if (realyRealyGoodLock == null)
return null;
return realyRealyGoodLock.getLockMode();
}
}
public static class RealyRealyGoodLock {
private LockMode lockMode;
public LockMode getLockMode() {
return lockMode;
}
public void setLockMode(LockMode lockMode) {
this.lockMode = lockMode;
}
}
public static class LockMode {
}
/**
* Hard
*/
public static LockMode getLockModeStandard(SomeHouse someHouse) {
if (someHouse == null) {
return null;
}
MainEntry mainEntry = someHouse.mainEntry;
if (mainEntry == null) {
return null;
}
RealyRealyGoodLock rGoodLock = mainEntry.realyRealyGoodLock;
if (rGoodLock == null) {
return null;
}
return rGoodLock.lockMode;
}
/**
* Not so hard
*/
public static LockMode getLockMode2(SomeHouse someHouse) {
if(someHouse == null) return null;
return someHouse.getLockMode();
}
}
Zamieniłem wszystkie publiczne pola na prywatne i dorzuciłem pary
getter/setter co nie było zbyt pracochłonne bo wygenerowało je za mnie
IDE. A do tego gettery nie są trochę rozgarnięte więc sprawdzają czy
przez przypadek obiekt, którym się opiekują nie jest null. Dzięki temu
na każdym poziomie sprawdzasz tylko raz czy jest null.
2)
W większości problemów zamiast dostarczać obiektom klasy SomeHouse
metody getLock() i umożliwieniu użytkownikom tej klasy zrobienia
paskudnych rzeczy z tym zamkiem: np naplucia, wepchnięcia peta itd
lepiej zrobić inaczej. Zaimplementować dla obiektu SomeHouse metody
typu lockHouse() i unlockHouse() czy isLocked() a to że one sobie
korzystają z klasy Lock to już wie tylko osoba implementująca a w
żądnym razie nie musi o tym wiedzieć użytkownik.
I większość osób piszących że naruszasz zasady OOP miała chyba to na myśli.
3)
Niestaty jak zauważa nawet międzynarodowy terrorysta obiektowy A.
Hollub są problemy w których nie da się ładnie programować zgodnie z
zasadami OOP (czyli np robić myki opisane w punkcie 2) i tyle.
Klasyczny przykładem jest tu właśnie dostarczenie ogólnej biblioteki
parsowania XML.
4)
Z tego co obserwuję Twoje posty to większość problemów jakie zgłaszasz
dotyczą raczej zagadnień stricte algorytmicznych. Ja osobiście
wychodzę z założenia iż nie ma sensu aby zarywał noce wkuwając
"Wprowadzenie do algorytmów" Cormen'a lub spędzić kilka lat na
analizowanie wszystkich tomów "Art of Computer Programming" D. Knuth'a
bo i tak to już ktoś zrobił i zrobił to pewnie lepiej a nawet jak nie
to i tak już inni to poprawili. Skupiam swoją uwagę na narzędziach,
frameworkach, efektywnych metodach tworzenia dobrego oprogramowania
itd. Myślę że takie podejście nie jest specyficzne tylko dla mnie.
Proponuję abyś Ty też spróbował.
Ale ponieważ każdy człowiek jest inny więc jeśli nie chcesz i Ciebie
bardziej kręci optymalizacja i algorytmy - OK ale zwróć uwagę na to,
iż język programowania Java jest dosyć kiepski w tym zakresie. Dużo
lepsze możliwości daje np. C/C++.
Jeżeli lubisz elastyczne języki może warto by programować w
JavaScript, Perl (ostrzegam eval() uzależnia :) czy choćby wspominany
Groovy.
Albo w najbardziej wykoksanym uber pro języku Lisp w którym sam
definiujesz konstrukcje typu if, switch, for :D (uczyłem się go tylko
kilka dni ale moje postrzeganie rzeczywistości nigdy już nie będzie
takie samo :)
A jeżeli chcesz zostać przy języku Java i zmienić kilka elementów to
proponuję rzucić okiem na projekty z serii: Apache Commons:
http://commons.apache.org/
Chłopaki i dziewczyny z ASF stwierdzili że można by poprawić JDBC
(http://commons.apache.org/dbutils/), kolekcje
(http://commons.apache.org/collections/). W sprawie transakcji
(http://commons.apache.org/transaction/) też mają swoje 3 grosze do
dorzucenia nie wspominając o obsłudzie typów podstawowych
(http://commons.apache.org/primitives/) algorytmów
(http://commons.apache.org/math/) ... i najlepsze na koniec: samej
składni języka Java: http://commons.apache.org/lang/.
Wydaje mi się, że na forach/listach mailingowych tych projektów
znalazł byś lepszych słuchaczy bo tam ludzie rozwiązują takie problemy
a tu wypowiadają się ludzie którzy są bardziej skłonni do ewentualnego
korzystania z nich a nie do ich pisania.
Nie wiem czy to dobry pomysł. Ostatnio ktoś zwrócił mi uwagę, że zbyt
często zabieram głos w sprawach w których jestem niekompetentny. Więc
może tu też głupoty wciskam :D Mam nadzieję że tak nie jest i że udało
mi się pomóc.
Pozdrawiam
W dniu 20 grudnia 2008 15:20 użytkownik Waldek Kot
<walde...@googlemail.com> napisał:
--
Piotr Paradziński
Lublin JUG: http://lublin.jug.pl
Blog: http://it-researches.blogspot.com/