Proč je kompatibilita důležitá
Čas od času narazím na horlivou diskusi na téma kompatibilita. Je vcelku jedno, zda se to týká OpenDocumentu vs. OpenXML, HTML 5.0 vs. XHTML 2.0 či jiné oblasti. Jednou z důležitých součástí podobných diskusí bývá otázka kompatibility a její (ne)důležitosti. Pro jedny je to důležité z důvodu zachování úsilí investovaného do nějakého výsledku, pro jiné je to zas těžká koule, s kterou je nutné se dále vláčet, a “přitom by to šlo udělat tak skvělě”, nově, bez jakýchkoliv omezení.
Proč o tom vlastně píšu? Shodou okolností se v posledních dnech snažím vyřešit jeden problém, který s kompatibilitou hodně souvisí. Pro jeden projekt používáme v práci vývojové prostředí NetBeans. Vyvíjena je v něm desktopová aplikace v Javě (Swing), pro kterou je GUI designer NetBeans přímo stvořený. Před nedávnem vyšla verze 6.0 tohoto vývojového prostředí a my začali řešit migraci projektu. Kromě několika dalších problémů jsme si všimli, že funkce na formátování zdrojového kódu se v nové verze chová “jaksi jinak”.
Pro neznalé vývojového prostředí NetBeans. Toto prostředí (a pravděpodobně i řada jiných) má takovou zajímavou funkci na automatické zformátování zdrojového kódu. Jednoduše označíte blok kódu, v místní nabídce zvolíte Reformat Code a prostředí provede formátování kódu. Tím máte zajištěno, že kód má všude přibližně stejný vzhled, odsazení bloků je stejné apod. S příchodem NetBeans 6.0 se uvedená funkce nejen přejmenovala na Format, ale hlavně se její funkčnost změnila! Jednoduše nyní formátuje podle jiných pravidel.
Možná si teď řada z vás řekne, že se jedná vlastně o prkotinu. Prostě se odteď bude formátovat podle toho, jak NetBeans 6.0 píská. To má však háček, pokud takto zformátuji nově přidávaný či upravovaný kód, budu mít rázem každou část kódu zformátovanou podle jiných pravidel. Vadí? Tak zformátujeme celý zdrojový kód a nejlépe celý projekt (řádově stovky souborů). Jeden super mega commit se změnami do SVN a je vymalováno. Jenže ouha, cosi se ztratilo. Ano, je to historie v SVN. Rázem se obtížně dohledá, kdo psal konkrétní část kódu, která mi zrovna není jasná. A máme problém.
A příčina tohoto? Autoři NetBeans v tomto případě nedomysleli kompatibilitu. Je určitě chválihodné, že verze 6.0 má daleko lepší možnosti konfigurace této funkce, ale autorům existujícího kódu napsaného ve starších verzích tohoto prostředí s užitím automatického formátování zkrátka situaci neusnadnili. Spíše naopak. Když jsem se pídil po možnostech nastavení stejného formátování, bylo mi odpovědí buď zaryté mlčení nebo odkaz na konfiguraci tohoto nástroje, které bohužel řeší zlomek toho, co by bylo pro nastavení staršího formátování potřeba.
No vidíte, a pak mi zkuste tvrdit, že kompatibilita není důležitá. Jak málo stačilo pro to, aby šlo přepnout na starší chování. U klávesových zkratek je to ostatně velmi jednoduché. Nebo si to mohly NetBeans převzít při importu nastavení ze starší verze. Možností bylo jistě více, leč řešení žádné. Škoda. Kompatibilita je zkrátka důležitá a respekt k již hotovému dílu by měl být pro autory specifikací/návrhů apod. svatý. Mnohdy tomu tak ale není a je to na škodu věci.




15. 2. 2008 v 11:51
Vy máte v SoftEU formátovačem jednotně upravený celý kód?
Přijde mi to jako dost šílené - ještě jsem totiž neviděl formátovač kódu, který by dokázal formátovat tak dobře, jako člověk. Třeba takový častý problém, jak rozdělit dlouhý řádek na více řádků. Formátovač to typicky udělá mechanicky (první token, který by přesáhnul x-tý sloupec, odsune o řádek níž), člověk podle logiky výrazu a tak, aby to bylo co nejčitelnější. Takových příkladů je mnohem víc.
Tipnul bych, že ta funkce byla vývojáři NetBeans míněna jen jako pomůcka, jak rychle vyčistit nepřehledný kód, nikoliv jako něco, co by měl vývojář pouštět na svůj kód před commitem. A z toho nejspíš taky plyne ten zpětně nekompatibilní přístup (potřebu kompatibility zde jednoduše neviděli). Ale to je jen odhad.
A ještě k “Kompatibilita je zkrátka důležitá a respekt k již hotovému dílu by měl být pro autory specifikací/návrhů apod. svatý. Mnohdy tomu tak ale není a je to na škodu věci.” bych doplnil, že to je hodně složitá otázka a rozhodně se na ni IMO nelze koukat takhle jednoznačně.
15. 2. 2008 v 14:36
V SoftEU je primární vývojové prostředí Eclipse. NetBeans používáme jen na jeden projekt, který je realizován ve Swingu. Formátovač NetBeans 5.5.1 slouží ke stylistickému doladění kódu, nedělá to rozdělování řádků, nepřekopává to strukturu kódu. Naopak je to velmi šikovná věc, pokud například zkopíruješ blok kódu doprostřed jiného bloku kódu. Nebo ti to odstraní prázdné znaky za jednotlivými řádky kódu. Doporučuji vyzkoušet.
Formátovač NetBeans 6.0 bohužel dělá věci, které by se daly shrnout do toho, co líčíš. Například pokud máš v třídě atributy, které máš seskupené podle jejich účelu a mezi jednotlivými skupinami máš třeba tři mezery, NetBeans 6.0 ti mezery odstraní a nechá jen jednu. Nebo zarovnání prázdných řádek mezi metodami. I zde se chování liší.
Není pravidlo, že u nás vývojář musí používat tento nástroj, ale všichni na projektu ho používají (v průběhu vývoje, nikoliv před commitem). Pokud pak vezmu NetBeans 6.0 a provedu tuto funkci nad blokem kódu, kde jsem tu a tam něco poupravil a funkce mi upraví prakticky každý řádek v bloku zformátovaný předchozí verzí NetBeans, pak to není dobře. Rázem mam jeden blok upravený jedním stylem, druhý blok jiným. O zbytečném přivlastňování řádků v SVN nemluvě.
19. 2. 2008 v 11:02
No tak využít jednu z výhod opensource a patchnout si netbeans
Pokud nedělali nějaký zběsilý refaktoring, nemuselo by to být tak pracné.
19. 2. 2008 v 18:05
To je sice hezká myšlenka, ale možná jen teoreticky. Těžko si představit situaci, kdy budu věnovat několik hodin času zkoumáním zdrojového kódu NetBeans s nejistým výsledkem, abych to pak dělal s každou další verzí, která vyjde.
2. 3. 2008 v 15:21
re:David Majda
ANO i NE …
Clovek to zvladne lepe, daleko lepe. Ale co s clovekem, ktery na to kasle? Zkousel si po nekom takovem cist kody? Co s clovekem, ktery ma navyk z jineho programovaciho jazyka a zbylym clenum naboura co znaji?
Proc si myslis, ze uz od pocatku jsou tu jiste definice? Nevadi Ti, ze musis psat promenne a metody s malym pismenem na zacatku, tridy s velkym na zacatku, konstanty velkymi pismenami… ???
Spis si myslim, ze je lepsi otazka: “Kam az takove pravidla muzou/maji/mohli by zajit?
PS: ospravedlnujem sa za pravopisne chyby
2. 3. 2008 v 15:35
re: David Majda
Jen trosicku zazlobim, je to jen “for”
… Ale co v kode dobreho programatora dela radek, ktery je trba delit?
I v prednaskach mas napsane:
‘Proč vlastně psát kvalitní kód?
* Ekonomicky se to vyplatí
* Kód jednou napsán, mnohokrát čten a upravován
o “Ztráta” času při psaní se vrátí později’
Jen to pls neber osobne
17. 4. 2008 v 10:40
Naprosto souhlasím. Protože často přebírám cizí kód, kde formátování bývá naprosto zběsilé, alespoň základní reformat code potřebuji (už jen kvůli tomu, abych se zbavil zmatku, když jsou pro odsazení používány částečně tabulátory a částečně mezery). Kvůli funkci “reformat code” jsem se dokonce rozhodl prozatím zůstat u NB 5.5.1, NB 6.0 zatím nemá nic, co bych nutně potřeboval…