"The... the the the... the language spec... oh, my god. I've gotta blog about this. It's, like, ninety percent [about the type system]. It's the biggest type system you've ever seen in your life, by 5x. Not by an order of magnitude, but man! There are type types, and type type types; there's complexity..."
Jestem jednak chyba większym od niego optymistą i uważam, że o ile można uznać Scalę za "onieśmielającą" to spójność języka pozwala na sukcesywne jego opanowywanie. Nie sądzę też, że programy stworzone za jego pomocą będą magiczne i niezrozumiałe.. Przede wszystkim uwzględnić trzeba w tym równaniu ekspresywność języka, która pozwoli zmniejszyć LOC tworzonych rozwiązań conajmniej dwukrotnie ("The Scala Experiment", system obsługi konferencji).
Mogę jednak z całą pewnością stwierdzić, że jest element, który został przy implementacji języka pominięty - a ja jestem bardzo niemile zaskoczony, że Odersky nie zdecydował się na jego zawarcie. Mowa o znanym z Eiffel'a i lubianym DBC (Design by Contract).
Brak zainteresowania DBC przez twórców języków dziwi mnie niesamowicie od czasu przeczytania "Object Oriented Software Construction" 2nd edition, Bertranda Meyera. Pamiętam, że rozdział o powyższym mechanizmie czytałem niemalże z wypiekami na twarzy.. Na początku, kiedy uczyłem się programowania obiektowego - interfejsów, klas abstrakcyjnych, kontrakt oparty o te konstrukcje wydawał mi się nadzwyczaj abstrakcyjny. Meyer pokazał, że moje obawy były jak najbardziej uzasadnione - bo przecież ile wart jest kontrakt bez opisu semantyki?! (Tyle ile waży ;])
Po latach pomysł wprowadzenia DBC pojawił się w Javie - okrojony i brzydszy - jako JSR 305 Annotations for Software Defect Detection. Mogę ostatecznie zaakceptować, że Java kontynuując strategię wstecznej zgodności przyjęła takie rozwiązanie. Nie potrafię jednak zrozumieć dlaczego DBC nie jest wbudowanym mechanizmem językowym w Scali. Scala już jest językiem przepełnionym konstrukcjami - ale co ważne spójnym! I tak długo jak spójność będzie zachowana warto dodać przełomowe według mnie rozwiązanie, jakim jest DBC. Niech stoją za mną słowa Meyera:
"This comment is relevant because Ada, although undoubtedly a “big language”, differs from others in that category by clearly showing (even to its critics) that it was designed and has little gratuitous featurism. As with other serious languages, the whole design is driven by a few powerful ideas, and every feature has a rational justification. You may disagree with some of these ideas, contest some of the justifications, and dislike some of the features, but it would be unfair to deny the consistency of the edifice. Consistency is indeed the key here: size, however defined, is a measure, but consistency is the goal."
Należy wspomnieć, że istnieje biblioteka umożliwiająca DBC dla Scali. Jest to jednak według mnie absolutnie niewystarczające (1). Przede wszystkim DBC powinno być wreszcie porządnie rozreklamowane.. choćby na przykładzie Ruby'ego widać, że bez dobrego marketingu (jakim dla niego był Ruby on Rails) nawet bardzo dobra technologia nie ma dużych na szans na popularyzację. Druga rzecz, że DBC można zbudować nawet na asercjach... to co jednak zaoferował w Eiffel'u Meyer - czyli silne wyabstrahowanie koncepcji poprzez wyróżnienie warunków pre i post oraz inwariantów, łącznie z ich dziedziczeniem (!!) jest ważnym krokiem w zapewnianiu jakości przy użyciu kontraktów.
DBC ma swoje wady i zalety (co nie ma ...) jednak czas wreszcie zauważyć, że w kolejce na listę popularnych konstrukcji językowych stoi już długo i jak najbardziej zasługuje żeby się tam dostać.
P.S. Tak sobie jeszcze pomyślałem - czy BDD nie ma więcej wspólnego z DBC niż by się nam zdawało....