W Królestwie Rzeczowników

Execution in the Kingdom of Nouns
W Królestwie Rzeczowników
 Mają charakterek, niektóre — w szczególności czasowniki: są najdumniejsze — z przymiotnikami możesz zrobić cokolwiek, ale nie z czasownikami — nie mniej jednak, ja potrafię radzić sobie z nimi wszystkimi! Koniec! Tako rzeczę!
— Humpty Dumpty

Witaj, świecie! Dzisiaj posłuchamy historii o Złym Królu Javie i jego dążeniu do światowego wybicia czasowników.1

Uwaga: ta historia nie ma szczęśliwego zakończenia. Nie jest to także historia dla osób o zajęczych sercach czy gorących głowach. Jeśli łatwo Cię obrazić lub masz tendencje do bycia blogowym niegodziwcem nie do przekonania, proszę przestań czytać już w tym miejscu.

Zanim przejdziemy do opowieści, pozbądźmy się pojęciowego paskudztwa.

Nadmiar śmieci

Wszyscy Javovcy uwielbiają “przypadki użycia”, więc zacznijmy z takowym: konkretnie, wynoszeniem śmieci. Tak jak w “Janek, wynieś śmieci! Przelewają się już!”

Jeśli jesteś normalną, codzienną, przeciętną, anglojęzyczną osobą poproszoną o opisanie czynności wynoszenia śmieci, prawdopodobnie myślisz o tym w mniej-więcej następujący sposób:

 get the garbage bag from under the sink  / wyciągnij worek ze śmieciami spod zlewu
 carry it out to the garage / zanieś go do garażu
 dump it in the garbage can / wrzuć go do kontenera na śmieci
 walk back inside / wróć do środka
 wash your hands / umyj dłonie
 plop back down on the couch / padnij z powrotem na kanapę
 resume playing your video game (or whatever you were doing) / wznów grę na konsoli (czy co tam robiłeś)

Nawet jeśli nie myślisz po angielsku, prawdopodobnie myślałeś o podobnym zbiorze akcji - z tym że w Twoim ulubionym języku. Abstrahując od wybranego języka, czy dokładnych kroków, wynoszenie śmieci jest ciągiem akcji kończącym się śmieciami na zewnątrz i Tobą wewnątrz, wskutek wykonanych przez Ciebie czynności.

Nasze myśli wypełnione są odważnymi, gwałtownymi, namiętnymi czynnościami: żyjemy, oddychamy, chodzimy, rozmawiamy, śmiejemy się, płaczemy, żywimy nadzieję, boimy się, jemy, pijemy, zatrzymujemy się, idziemy, wynosimy śmieci. Ponad wszystko inne, możemy czynić i funkcjonować. Gdybyśmy byli tylko kamieniami leżącymi na słońcu, życie mogłoby być wciąż OK, ale nie bylibyśmy “wolni”. Nasza wolność wynika dokładnie z możliwości robienia czegoś.

Oczywiście, nasze myśli są wypełnione także rzeczownikami. Jemy rzeczowniki i kupujemy rzeczowniki w sklepie, siedzimy na rzeczownikach, śpimy na nich. Rzeczowniki mogą spaść Ci na głowę, w efekcie czego będziesz miał(a) wielki rzeczownik na swoim rzeczowniku. Rzeczowniki są rzeczami, a co my byśmy bez nich zrobili? One są jednak tylko rzeczami, to wszystko: środki przemijające, czy przeminięcie jako takie, czy cenne dobra, czy nazwy obiektów, które obserwujemy wokół nas. Tam jest budynek. Tu jest kamień. Każde dziecko może wskazać rzeczowniki. To zmiany stanu tych rzeczowników czynią je interesującymi.

Zmiana wymaga akcji. Akcja to to, co nadaje życiu smak. Akcje nadają smak własnemu smakowi! W końcu, nie smakują póki ich nie zjesz. Rzeczowniki mogą być wszędzie, ale życie to ciągła zmiana i ciągłe nim zainteresowanie - całe zawarte w czasownikach.

Oczywiście oprócz czasowników i rzeczowników, mamy nasze przymiotniki, przyimki, nasze zaimki, rodzajniki, nieuniknione koniunkcje, smakowite wykrzykniki, i wszystkie inne wspaniałe części mowy, które pozwalają nam myśleć i mówić interesujące rzeczy. Myślę, że możemy się wszyscy zgodzić, że każda z części mowy ma swoje zadanie i wszystkie są ważne. Byłoby szkoda stracić którąkolwiek z nich.

Nie byłoby dziwnie, gdybyśmy nagle zdecydowali, że nie możemy korzystać z czasowników?

Opowiem Wam historię o miejscu, w którym właśnie tak się stało...

Królestwo rzeczowników

W Królestwie Javalandii, gdzie Król Java rządzi krzemową pięścią, ludziom nie wolno myśleć w sposób w jaki robię to ja czy Ty. W Javalandii, widzisz, rzeczowniki są bardzo ważne, na mocy rozkazu samego Króla. Rzeczowniki są najważniejszymi obywatelami Królestwa. Paradują pysznie w swoich wytwornych, pokazowych strojach, dostarczonych przez Przymiotniki, które generalnie mają trochę lżej niż inni. Przymiotniki nie dorastają do pięt Rzeczownikom, ale uważają się za całkiem szczęśliwe za to, że nie urodziły się Czasownikami.

A to dlatego, że Czasowniki w tym Królestwie mają bardzo, bardzo źle.

W Javalandii, na mocy królewskiego dekretu, Czasowniki należą do Rzeczowników. Nie są jednak ich zwierzętami domowymi; nie, Czasowniki w Javalandii wykonują całą pracę w królestwie. Są, w rezultacie, niewolnikami królestwa, a przynajmniej poddanymi i zniewolonymi sługami. Mieszkańcy Javalandii są całkiem kontent z tą sytuacją, i w istocie prawie nie zdają sobie sprawy, że rzeczy mogłyby wyglądać zupełnie inaczej.

Czasowniki w Javalandii są odpowiedzialne za całą pracę, i choć bardzo przez wszystkich pogardzane, żaden Czasownik nie może nigdy podróżować samodzielnie. Jeżeli jakiś czasownik ma się pojawić w jakimś publicznym miejscu, to musi być przez cały czas pod eskortą Rzeczownika.

Oczywiście “eskortować”, będąc Czasownikiem, nie ma możliwości kręcić się bez obstawy; trzeba postarać się o VerbEscorter’a by tą właśnie eskortę umożliwić. Ale co z “postarać się” (facilitate) i “umożliwić” (procure)? Tak się składa, że Facilitator’zy i Procurer’zy są raczej ważnymi Rzeczownikami, których zadaniem jest opieka nad skromnymi “postarać się” (facilitate) i procure (umożliwić), przez Facilitation i Procurement, odpowiednio.

Król, konsultując się z Bogiem Słońce w tej sprawie, groził od czasu do czasu całkowitym wygnaniem wszystkich czasowników z Królestwa Javy. Jeżeli to kiedykolwiek nadejdzie, to mieszkańcy z pewnością będą potrzebowali przynajmniej jednego czasownika do wykonywania całej pracy w państwie, a Król, który słynie z raczej okrutnego poczucia humoru, wskazał, że jego wyborem będzie najprawdopodobniej “execute” (wykonywać, także wyrok śmierci - przyp. tłum.).

Czasownik “execute” i jego synonimowi kuzyni “run”, “start”, “go”, “justDoIt”, “makeItSo”, i im podobni, mogą wykonać pracę dowolnego innego czasownika przez zastąpienie go odpowiednim Wykonawcą (Executioner) i wywołaniem execute(). Musisz poczekać? Waiter.execute().. Umyć zęby? ToothBrusher(myTeeth).go(). Wynieść śmieci? TrahsDisposalPlanExecutor.doIt(). Żaden czasownik nie jest bezpieczny; wszystko może być zastąpione Rzeczownikiem.

W co bardziej patriotycznych zakątkach Javalandii Rzeczowniki całkowicie usunęły Czasowniki. Może wyglądać na to w trakcie okazjonalnych inspekcji, że tam wciąż gdzieś są Czasowniki, uprawiające ziemię i opróżniające nocniki. Jeśli jednak dobrze się przyjrzeć, sekret wyjdzie na jaw: Rzeczowniki mogą przemianować swój Czasownik “execute” nadając im własne imię bez najmniejszego wpływu na ich charakter. Kiedy przyjrzysz się FieldTiller till(), ChamberPotEmptier empty() czy RegistrationManager register(), to co naprawdę zobaczysz to jedną z armii wykonawców (executioners) złego Króla, skrytych pod ubraniami Rzeczownika-właściciela.

Czasowniki w Sąsiadujących Królestwach

W sąsiadujących królestwach języków programowania, wynoszenie śmieci jest sprawą oczywistą, bardzo podobną do tej, którą opisaliśmy wcześniej po angielsku. Tak jak w przypadku Javy, obiekty danych są rzeczownikami, a funkcje są czasownikami2. Ale inaczej niż w Javalandii, obywatele innych królestw mogą się mieszać i łączyć z rzeczownikami i czasownikami zależnie od własnych upodobań, zgodnie z planem na życie.

Dla przykładu, w sąsiadujących światach C-landii, JavaScript-landii, Perl-landii i Ruby-landii, ktoś mógłby wymodelować wynoszenie śmieci jako ciąg akcji - lub, jakby to ująć, czasowników czy funkcji. Jeśli wtedy zaaplikują akcje do odpowiednich obiektów, w odpowiedniej kolejności (weź śmieci, wynieś je na zewnątrz, wrzuć do śmietnika, itd.), zadanie usunięcia nieczystości zakończy się sukcesem, bez zbędnej eskorty i opiekunek potrzebnych do wykonania któregokolwiek kroku.

Rzadko zdarza się, by zaszła potrzeba tworzenia opakowujących rzeczowników do spowicia czasowników w tych królestwach. Nie mają rzeczowników takich jak GarbageDisposalStrategy czy PostGarbageActionCallback do ulokowania Cię z powrotem na Twojej kanapie. Piszą po prostu czasowniki operujące na rzeczownikach leżących w okolicy, a następnie tworzą czasownik nadrzędny, take_out_garbage(), który powiązuje podzadania w odpowiednim porządku.

Te sąsiadujące królestwa generalnie dostarczają mechanizmów do tworzenia ważnych rzeczowników, jeśli zajdzie taka potrzeba. Jeśli pracowici wynalazcy w tych królestwach stworzą zupełnie nową, użyteczną ideę która wcześniej nie istniała, taką jak dom, wóz, czy maszynę do uprawy pól szybszą od człowieka, to mogą nadać tej idei Klasę, która dostarcza nazwy, opisu, jakiegoś stani i instrukcji potrzebnych do działania.

Różnica w tym, że gdy Czasowniki mogą istnieć niezależnie - nie musisz wymyślać dla nich nowych Rzeczowników do ich okiełznania.

Javalandowcy patrzą na swoich sąsiadów z pogardą; tak to już jest w Królestwach Programowania.

Jeśli będziesz kopał dostatecznie długo...

Na przeciwnym krańcu świata istnieje rzadko zaludniony region, w którego królestwach Czasowniki wiodą prym. Są to Królestwa Funkcjonalne, takie jak Haskellia, Ocamlica, Schemeria, i jeszcze kilka innych. Ich mieszkańcy rzadko stykają się z królestwami bliskimi Javalandii. Ponieważ istnieje kilka królestw w okolicy, Królestwa Funkcjonalne muszą patrzyć z pogardą na siebie nawzajem i prowadzić wzajemne wojny, gdy nie mają nic lepszego do roboty.

W Królestwach Funkcjonalnych, Rzeczowniki i Czasowniki są zasadniczo obywatelami tej samej kategorii. Niemniej jednak, Rzeczowniki, bedąc, cóż, rzeczownikami, głównie siedzą bezczynnie. Nie widzą sensu w wykonywaniu czegokolwiek, ponieważ Czasowniki są dość aktywne i robią to wszystko za nie. Nie panują dziwne prawa zobowiązujące do tworzenia Rzeczowników pomocniczych do eskortowania każdego z czasowników, więc jest tam dokładnie tyle Rzeczowników, co Rzeczy w każdym z królestw.

W rezultacie, Czasowniki trzymają wszystko w kupie, wybacz wyrażenie. Jako człowiek z zewnątrz, mógłbyś łatwo odnieść wrażenie, że Czasowniki (tzn., funkcje) są najważniejszymi mieszkańcami. Tak się składa, że dlatego właśnie królestwa te nazywają się Królestwami Funkcjonalnymi, a nie Królestwami Rzeczy.

W najodleglejszych rubieżach, za Królestwami Funkcjonalnymi, leży legendarny świat zwany Lambda the Ultimate. Mówi się, że nie ma tam rzeczowników w ogóle, tylko czasowniki! Są tam “rzeczy”, ale wszystkie one tworzone są z czasowników - nawet liczebniki potrzebne do liczenia owiec (lambs, gra słów) - które są tam najpopularniejszą walutą, jeśli wierzyć plotkom. Liczba zero to po prostu lambda(), 1 to lambda(lambda()), 2 to lambda(lambda(lambda())), i tak dalej. Każda Rzecz w tej krainie, niech będzie rzeczownik, czasownik czy cokolwiek, stworzona jest z pierwotnego czasownika “lambda”3.

Będąc całkiem szczerym, większość Javalandowców jest kompletnie nieświadoma istnienia tej drugiej części świata. Możesz sobie wyobrazić ich szok kulturowy? Mogliby zostać tak skołowani, że wymyśliliby nowe rzeczowniki (takie jak “Ksenofobia”) by wyrazić swoje uczucia.

Czy Javalandowcy są szczęśliwi?

Możnaby pomyśleć, że życie codzienne w Javalandii jest co najmniej trochę dziwne, a co najwyżej mocno niewydajne. Możesz jednak ocenić jak szczęśliwe jest społeczeństwo po piosenkach śpiewanych dzieciom. Te z Javalandii są kapryśnie poetyckie. Dla przykładu, dzieci z Javalandii często recytują sławną pouczającą piosenkę:

For the lack of a nail, / z braku gwoździa,
   throw new HorseshoeNailNotFoundException("no nails!");

For the lack of a horseshoe, / z braku podkowy,
   EquestrianDoctor.getLocalInstance().getHorseDispatcher().shoot();

For the lack of a horse, / z braku konia,
   RidersGuild.getRiderNotificationSubscriberList().getBroadcaster().run(
     new BroadcastMessage(StableFactory.getNullHorseInstance()));

For the lack of a rider, / z braku jeźdźca,
   MessageDeliverySubsystem.getLogger().logDeliveryFailure(
     MessageFactory.getAbstractMessageInstance(
       new MessageMedium(MessageType.VERBAL),
       new MessageTransport(MessageTransportType.MOUNTED_RIDER),
       new MessageSessionDestination(BattleManager.getRoutingInfo(
                                       BattleLocation.NEAREST))),
     MessageFailureReasonCode.UNKNOWN_RIDER_FAILURE);

For the lack of a message, / z braku wiadomości,
   ((BattleNotificationSender)
     BattleResourceMediator.getMediatorInstance().getResource(
       BattleParticipant.PROXY_PARTICIPANT,
       BattleResource.BATTLE_NOTIFICATION_SENDER)).sendNotification(
         ((BattleNotificationBuilder)
           (BattleResourceMediator.getMediatorInstance().getResource(
           BattleOrganizer.getBattleParticipant(Battle.Participant.GOOD_GUYS),
           BattleResource.BATTLE_NOTIFICATION_BUILDER))).buildNotification(
             BattleOrganizer.getBattleState(BattleResult.BATTLE_LOST),
             BattleManager.getChainOfCommand().getCommandChainNotifier()));

For the lack of a battle, / z braku walki,
   try {
       synchronized(BattleInformationRouterLock.getLockInstance()) {
         BattleInformationRouterLock.getLockInstance().wait();
       }
   } catch (InterruptedException ix) {
     if (BattleSessionManager.getBattleStatus(
          BattleResource.getLocalizedBattleResource(Locale.getDefault()),
          BattleContext.createContext(
            Kingdom.getMasterBattleCoordinatorInstance(
              new TweedleBeetlePuddlePaddleBattle()).populate(
                RegionManager.getArmpitProvince(Armpit.LEFTMOST)))) ==
         BattleStatus.LOST) {
       if (LOGGER.isLoggable(Level.TOTALLY_SCREWED)) {
         LOGGER.logScrewage(BattleLogger.createBattleLogMessage(
           BattleStatusFormatter.format(BattleStatus.LOST_WAR,
                                        Locale.getDefault())));
       }
     }
   }

For the lack of a war, / z braku wojny,
   new ServiceExecutionJoinPoint(
     DistributedQueryAnalyzer.forwardQueryResult(
       NotificationSchemaManager.getAbstractSchemaMapper(
         new PublishSubscribeNotificationSchema()).getSchemaProxy().
           executePublishSubscribeQueryPlan(
             NotificationSchema.ALERT,
             new NotificationSchemaPriority(SchemaPriority.MAX_PRIORITY),
             new PublisherMessage(MessageFactory.getAbstractMessage(
               MessageType.WRITTEN,
               new MessageTransport(MessageTransportType.WOUNDED_SURVIVOR),
               new MessageSessionDestination(
                 DestinationManager.getNullDestinationForQueryPlan()))),
             DistributedWarMachine.getPartyRoleManager().getRegisteredParties(
               PartyRoleManager.PARTY_KING ||
               PartyRoleManager.PARTY_GENERAL ||
               PartyRoleManager.PARTY_AMBASSADOR)).getQueryResult(),
       PriorityMessageDispatcher.getPriorityDispatchInstance())).
     waitForService();

Wszystko z braku gwoździa do podkowy.

Pozostaje to wspaniałą radą po dziś dzień.

Pomimo, że opowiadanie tej historii w Javalandii różni się nieco od oryginału Bena Franklina, Javalandowcy czują, że ich wykonanie ma swój własny urok.

Głównym urokiem jest to, że wszyscy mogą obejrzeć architekturę. Architektura jest wyjątkowo wysoce poważana przez Króla Javę - a to dlatego, że złożona jest wyłącznie z rzeczowników. Jak wiemy, rzeczowniki są rzeczami, a rzeczy są cenione ponad wszystkie czynności w Królestwie Javy. Architektura składa się z rzeczy, które możesz zobaczyć i dotknąć, rzeczy, które imponująco piętrzą się przed Tobą, rzeczy, które wydają z siebie satysfakcjonujący stuk gdy przywalisz w nie patykiem. Król Java lubuje się w tych stukach; nie posiada się z zadowolenia, gdy kopie koła podczas wypróbowywania swojego nowego powozu konnego. Jakiekolwiek wady by miała, powyższa opowieść chwali rzeczy.

Jednym z naszych - jako istot ludzkich - pierwszych instyktów jest poszukiwanie schronienia przed żywiołami; im trwalsza nasza osłona, tym bezpieczniej się czujemy. W Javalandii znajduje się mnóstwo rzeczy pozwalających mieszkańcom czuć się bezpiecznie. Oglądają z podziwem twory architektury i myślą “to musi być trwały design”. Uczucie to jest wzmocnione, gdy próbują dokonać zmian w strukturze; potęga architektury zaczyna zrażać na tyle, że czują, że nikt nie jest w stanie zburzyć tej struktury.

Oprócz zalet związanych z trwałą architekturą, wszystko w Javalandii jest ładnie zorganizowane: każdy rzeczownik znajduje się w odpowiednim miejscu. I wszystkie historie przyjmują określony kształt: tworzenie obiektu jest dominującym rodzajem wyrażenia, z menedżerem dla każdej abstrakcji i metodą run() dla każdego menedżera. Przy odrobinie doświadczenia w tego rodzaju modelowaniu, obywatele Javy uświadamiają sobie, że są w stanie wyrazić każdą historię w taki sposób. Istnieje pewien rodzaj “rachunku rzeczowników”, który pozwala na wyrażenie każdej abstrakcji, każdego obliczenia - jakie tylko zechcesz. Wszystko, czego trzeba, to wymagane rzeczowniki, konstruktory dla tych rzeczowników, akcesory do przechodzenia grafu rzeczowników i najważniejsze execute() do zrealizowania czyichś planów.

Mieszkańcy Królestwa Javy nie są jedynie szczęśliwi - oni nie posiadają się z dumy!

StateManager.getConsiderationSetter("Noun Oriented Thinking", State.HARMFUL).run()

Lub, jak to się mówi poza Królestwem Javy, “Programowanie zorientowane rzeczownikowo rozważane jako szkodliwe”.

Programowanie zorientowane obiektowo stawia Rzeczowniki na pierwszej i najważniejszej pozycji. Dlaczego miałbyś się zapuszczać tak daleko, żeby postawić na piedestale jedną z części mowy? Dlaczego jeden rodzaj idei miałby być lepszy od innego? To trochę tak, że PZO uczyniło czasowniki mniej znaczącymi w naszym sposobie myślenia. To dziwnie zakrzywiona perspektywa. Jak to ujął pewnego razu mój przyjaciel Jacob Gabrielson, promowanie Programowania Zorientowanego Obiektowo to jak promowanie Ubierania się Zorientowanego na Spodnie.

Statyczny system typów Javy, jak każdy inni, ma swój zestaw bolączek. Wyjątkowy nacisk na myślenie zorientowane rzeczownikowo (i, w konsekwencji, proces modelowania) jest więcej niż odrobinę niepokojące. Każdy system typów będzie wymagał od Ciebie przekształcenia swoich myśli tak, by pasowały do systemu; wyeliminowanie samodzielnych czasowników wydaje się być jednak krokiem posuniętym poza wszelkie racje i rozsądek.

C++ nie przejawia tego problemu, jako że C++, będąc nadzbiorem C, pozwala na definiowanie samodzielnych funkcji. Ponadto, C++ dostarcza osobnej abstrakcji dla przestrzeni nazw; Java przeładowuje ideę Klasy do reprezentowania przestrzeni nazw, typów zdefiniowanych przez użytkownika, syntaktycznych mechanizmów delegacji, pewnych mechanizmów widoczności i zakresu, i więcej..

Nie zrozum mnie źle; nie twierdzę, że C++ jest “dobry”. Doceniam jednak elastyczność jego systemu typów, przynajmniej w porównaniu z Javą. C++ cierpi z powodu problemów powodujących, że rozsądnie wyglądające zdania powodują, że listenery robią “trzask!” i próbują Cię zabić (dla przykładu, niespodziewane segfaulty czy inne pułapki na nieostrożnych) i może być niesamowicie trudno znaleźć odpowiednią inkantancję do wyrażenia konkretnej myśli w C++. Zakres zwięźle wyrażalnych myśli wykracza jednak daleko poza możliwości Javy; to dlatego, że C++ daje Ci czasowniki, a kto chciałby mówić językiem, który tego nie daje?

Klasy to naprawdę jedyne narzędzie do modelowania, jakiego dostarcza Java; dlatego też, kiedykolwiek wpadniesz na jakiś pomysł, musisz go rzeźbić lub opakowywać lub rozbijać aż stanie się rzeczą - nawet jeśli urodziła się jako akcja, proces czy jakakolwiek inna nie-rzecz.

Naprawdę zrozumiałem, co mówili mi Perlowcy 8 czy 9 lat temu: “Stary, nie wszystko jest obiektem.”

Mimo to dziwnym jest, że Java4 zdaje się być jedynym mainstreamowym językiem zorientowanym obiektowo, który przejawia radykalnie rzeczowniko-centryczny charakter. Prawie nigdy nie znajdziesz AbstractProxyMediator’a czy NotificationStrategyFactory, czy czegokolwiek w tym stylu, w Pythonie czy Ruby’m. Dlaczego są wszędzie w Javie? To pewne, że różnica leży w czasownikach. Python, Ruby, JavaScript, Perl, i oczywiście wszystkie języki Funkcyjne pozwalają Ci deklarować i przekazywać funkcje jako osobne byty bez potrzeby owijania je w klasy.

Z pewnością jest łatwiej zrobić takie rzeczy w językach typowanych dynamicznie; przekazujesz po prostu referencję do funkcji otrzymanej z jej nazwy, i już w gestii strony wywołującej funkcję leży to, by przekazać odpowiednie argumenty i użyć poprawnie zwróconej wartości.

Wiele statycznie typowanych języków posiada - mimo to - funkcje pierwszego rzędu. Są to na przykład języki o rozwlekłym typowaniu jak C i C++, a także języki z inferencją typów jak Haskell czy ML. Języki muszą po po prostu dostarczyć składni do tworzenia, przekazywania i wywoływania literałów funkcyjnych z odpowiednią sygnaturą.

Nie ma powodu, dla którego Java nie mogłaby zwyczajnie dodać funkcji pierwszego rzędu i w końcu dołączyć do dorosłego, nieskrzywionego świata pozwalającego ludziom używać czasowników w ich procesach myślowych. W istocie, istnieje język na JVM zwany Nice, o javovej składni, ale zawierający dość potężne w wyrazie udogodnienia dla korzystania z czasowników: samodzielne funkcje, które Java zmusza do bycia owinięte w Callback’i czy Runnable czy inne im podobne interfejsy by móc się do tychże funkcji odwoływać.

Sun nie musiałby nawet łamać swojej konwencji w której wszystkie funkcje musiałyby być “zawarte” w klasach. Każda anonimowa funkcja mogłaby posiadać niejawny wskaźnik “this” do klasy, w której była zdefiniowana; problem z głowy.

Nie wiem, dlaczego Sun nalega na utrzymanie Javy w Królestwie Rzeczowników. Wątpię, że jest to problem niedocenienia wyborców; dodali genericsy, które są o wiele bardziej złożonym pomysłem; jasnym jest, że nie przejmują się już prostotą języka. To niekoniecznie źle, jako że Java ma już dość ugruntowaną pozycję: więcej sensu ma danie programistom Javy narzędzi, które pozwolą im programować w sposób, w jaki myślą.

Mam szczerą nadzieję, że kiedyś to naprawią, a ja będę mógł wynieść moje śmieci i wrócić do swojej gry komputerowej. Czy co tam robiłem.


[1] Zaczynając od czasownika “tłumić”, który zostaje zastąpiony przez wywołanie VerbEliminatorFactory.createVerbEliminator(currentContext).operate(); to wszystko jednak dopiero przed nami...

[2] Nazwy zmiennych to poprawne rzeczowniki, atrybuty to przymiotniki, operatory zwykle służą jako koniunkcje, varargs jako zaimek “wy (wszyscy)”, i tak dalej; to wszystko leży jednak poza zakresem naszej historii.

[3]Znaczenie czasownika “lambda” to rzekomo “lambdować”.

[4]I prawdopodobnie C#, z racji na podobne korzenie.

Data publikacji oryginału: marzec 30, 2006

6 komentarze:

Sławek Sobótka pisze...

Bawię się Javą od dosyć dawna i muszę przyznać rację, że niesławne tak zwane Object Wrappery są rzeczywiście sztucznymi bytami - np różnego rodzaju Servisy wszechobecne w Java EE; są niczym innym jak paczką procedur. Instancja jest sztucznie tworzona tylko po to aby mieć "na czym" odpalić procedurę.

Ogólnie można się zastanowić nad sensownością istnienia bytów pod tytułem obiekty bezstanowe.

Ale z drugiej strony wyśmiane w końcowej części tekstu strategie są bardzo fajne. Mamy oto interfejs (z jedną metodą typu execute), który definiuje kontrakt jaki musi spełnić dostawca strategii. Wszystko jest czytelne i przejrzyste, a IDE potrafi wiele wywnioskować i podpowiedzieć. A to, że trzeba napisać 50 znaków więcej - ojej, ojej to takie straszne, wszyscy zginiemy;P Kod wielokrotnie częściej się czyta niż pisze więc liczy się czytelność.

Poza tym pomiędzy składnią języka a dobrym softem nie ma zbytniej korelacji, dlatego nie ma potrzeby popadać w onanizm techniczny (w tym wypadku składniowy). W dobrym sofcie chodzi o coś zupełnie innego...

Anonimowy pisze...

Ja zupełnie z innej beczki powiem, że podziwiam wkład pracy tłumacza. Artykuł jest bardzo długi i nie ma rzucających się w oczy błędów. Respect.

Tomasz Kowalczyk pisze...

Czyta się jak dobrą książkę, kiedy wydanie papierowe? ;] A tak na poważnie, to ja od bardzo długiego czasu mam żal do Javy za tą wymuszoną ponad wszystko obiektowość i w konsekwencji opisaną wyżej "rzeczownikowość". Co innego, kiedy coś "można", a co innego, kiedy zwyczajnie jesteśmy zmuszani do określonego poglądu - dlatego m. in. lubię C++. ;]

Karol Stosiek pisze...

Dzięki wielkie za pozytywną ocenę! Postaram się, aby następne tłumaczenia czytało się równie dobrze.

W kwestiach technicznych wypowiem się po urlopie ;-)

yanoo pisze...

3 i 4 przypis są źle podlinkowane

rafek pisze...

@yanoo: Dzięki! Poprawione.

Prześlij komentarz

Related Posts with Thumbnails