Potrzebny cytat:Użycie preprocesora to zła praktyka OO

Potrzebny cytat:Użycie preprocesora to zła praktyka OO

Henry Spencer napisał artykuł zatytułowany #ifdef Uważany za Szkodliwy.

Również sam Bjarne Stroustrup w rozdziale 18 swojej książki The Design and Evolution of C++ marszczy brwi na użycie preprocesora i chce go całkowicie wyeliminować. Jednak Stroustrup dostrzega również potrzebę dyrektywy #ifdef i kompilacji warunkowej, a następnie pokazuje, że nie ma dla niej dobrej alternatywy w C++.

Wreszcie, Pete Goodliffe, w rozdziale 13 swojej książki Code Craft:The Practice of Writing Excellent Code, podaje przykład, jak #ifdef może narobić bałaganu w twoim kodzie, nawet jeśli jest używany zgodnie z jego pierwotnym przeznaczeniem.

Mam nadzieję że to pomoże. Jeśli jednak Twoi współpracownicy w pierwszej kolejności nie będą słuchać rozsądnych argumentów, wątpię, czy cytaty z książek pomogą ich przekonać;)


IMHO, mówisz o C i C++, a nie o praktyce OO w ogóle. A C nie jest zorientowane obiektowo. W obu językach preprocesor jest właściwie użyteczny. Po prostu używaj go poprawnie.

Myślę, że ta odpowiedź należy do C++ FAQ:[29.8] Mówisz, że preprocesor jest zły?

Mam nadzieję, że to źródło jest wystarczająco wiarygodne :-)


Dyrektywy preprocesora w C# mają bardzo jasno zdefiniowane i praktyczne przypadki użycia. Te, o których konkretnie mówisz, zwane dyrektywami warunkowymi, służą do kontrolowania, które części kodu są kompilowane, a które nie.

Istnieje bardzo ważna różnica między niekompilowaniem części kodu a kontrolowaniem sposobu, w jaki wykres obiektów jest połączony przez IoC. Spójrzmy na przykład ze świata rzeczywistego:XNA. Kiedy tworzysz gry XNA, które planujesz wdrożyć zarówno w systemie Windows, jak i na konsoli Xbox 360, Twoje rozwiązanie będzie zazwyczaj zawierało co najmniej dwie platformy, między którymi możesz się przełączać, w swoim środowisku IDE. Będzie między nimi kilka różnic, ale jedną z tych różnic będzie to, że platforma XBox 360 zdefiniuje symbol warunkowy XBOX360, którego możesz użyć w swoim kodzie źródłowym za pomocą następującego idiomu:

#if (XBOX360)
// some XBOX360-specific code here
#else
// some Windows-specific code here
#endif

Możesz oczywiście wykluczyć te różnice za pomocą wzorca projektowego Strategii i sterować przez IoC, który zostanie utworzony, ale kompilacja warunkowa oferuje co najmniej trzy główne zalety:

  1. Nie wysyłasz kodu, którego nie potrzebujesz.
  2. Możesz zobaczyć różnice między kodem specyficznym dla platformy dla obu platform w odpowiednim kontekście tego kodu.
  3. Nie ma narzutu pośredniego. Odpowiedni kod jest kompilowany, drugi nie i to wszystko.