[PL] Smutna jest knajpa byłych C++'owców :)

Tak Kazikiem podjechałem trochę, ale o mamo..

Tydzień zabawy z C++ w Visual Studio 2008 i płakać mi się chce. Może już mam umysł .NET'owca, ale tylu rzeczy mi brakuje.

W skrócie, bez jakiegoś jeszcze szczególnego pomysłu na program wyszedłem z hardcore'owego założenia, że mam składnie języka, IDE, własną głowe i conajwyżej WinAPi do podparcia i bah.. wymyślam koło od nowa czyli buduję Framework.

Ambitnie sobie po samym głównym namespace'ie nazwałem go TheFramework (wymowa: Tfu Dwe Frejmwerk :>)

Jest to jeszcze bardzo niedojrzała konstrukcja i na razie mogę ją wyrazić poniższym diagramem (click powinien dać abstrakcyjne powiększenie)

image

Spostrzeżenia:
* Cóż, odwykłem już chyba od walki z składnią, kompilatorem i nieczytelnymi komunikatami błędów. Walor C++. Przykład: Ten mój TheFramework siedzi sobie w DLLce. Oczywiście, aby sprawnie wyłuskać potem klasy i dać komunikat przy generowaniu .lib'a muszę posilić się taką miła konstrukcją:

#ifndef THEFRAMEWORK_API
    #ifdef THEFRAMEWORK_EXPORTS
    #define THEFRAMEWORK_API __declspec(dllexport)
    #else
    #define THEFRAMEWORK_API __declspec(dllimport)
    #endif
#endif

Wyrzuciłem sobie ten kawałek makro-kodu do osobnego nagłówka i co gdy zapomnę umieścić #include do tego pliku a moja klasa będzie zawierała deklarację THEFRAMEWORK_API? 

Sypnie błedami jak poniżej:

Error    1    error C2470: 'Interface' : looks like a function definition, but there is no parameter list; skipping apparent body    c:\users\danieb\documents\visual studio 2008\projects\theframework\theframework\object.h    21    TheFramework
Error    2    error C2470: 'Object' : looks like a function definition, but there is no parameter list; skipping apparent body    c:\users\danieb\documents\visual studio 2008\projects\theframework\theframework\object.h    31    TheFramework
Error    3    error C2470: 'DisposableObject' : looks like a function definition, but there is no parameter list; skipping apparent body    c:\users\danieb\documents\visual studio 2008\projects\theframework\theframework\object.h    43    TheFramework
Error    4    error C2470: 'Delegate' : looks like a function definition, but there is no parameter list; skipping apparent body    c:\users\danieb\documents\visual studio 2008\projects\theframework\theframework\object.h    54    TheFramework
Error    5    error C2470: 'Runnable' : looks like a function definition, but there is no parameter list; skipping apparent body    c:\users\danieb\documents\visual studio 2008\projects\theframework\theframework\object.h    59    TheFramework
Error    6    error C2470: 'CallingStack' : looks like a function definition, but there is no parameter list; skipping apparent body    c:\users\danieb\documents\visual studio 2008\projects\theframework\theframework\exception.h    13    TheFramework

I tak dalej. Patrzę potem na definicję moich klas i w jak byk nie mogę zobaczyć gdzie ten kompilator tam zobaczył funkcję. Rozkosz. Po paru takich awariach mam już wbite w głowę, że zapomniałem dodać  swojego magicznego:  #include "TheFrameworkDllImports.h"

Jestem w stanie się założyć, że ktoś z akademicką wiedza na temat C++ i dużą ilością rozleniwiającej praktyki w .NET Framework czy Java, jak zobaczy taki bład przy prostej konstrukcji:

      class THEFRAMEWORK_API Object
      {
      public:
            Object(void);
            virtual ~Object(void);

            inline virtual wchar_t* ToString() {                 
return L"Base object";
            }

            inline virtual wchar_t* GetType() = 0;

      };

 

To zdębieje na godzinę kląc jak szewc i sprawdzając średniki, dwukropki i inne dyrdymały. No ale to oczywiście taki hobbistyczny żart i w sumie przyznanie się ponowne, że odwykłem od języka i dawno nie miałem praktyki. Pewnie multum tego typu głupich błedów można uniknąć tylko poprzez codzienne pisanie, tylko. Co nie zmienia faktu, że po doświadczeniach z zarządzanym kodem człowiek sobie zaczyna myśleć "what the kurka wodna". Managed C++ pomoże? No nie wiem.. cóż.. trzeba to kochać i przyznam, że po tygodniu zabawy nawet to polubiłem i z tesknotą i nostalgią przypomniałem sobie, że w sumie kiedyś to chyba też dosyć często walczyłem z kompilatorem i językiem tylko po to, żeby moja zawiła konstrukcja miała obiektowe ręce i nogi w moim skromnym mniemaniu.

No okay.. Język językiem, ale środowisko. Eh.. trochę jakby niewiele się zmieniło co mnie smuci przy całej tej dramatycznej ewolucji w kontekście .NET Framework. Można to chyba potraktować jako nasz trend Managed C++ to upgrade'u kodu w górę, a przyszłość to .NET kochani. Nisza w postaci paru rynków gdzie C++ ciągle wiedzie prymat musi sobie jakoś radzić, no ale do rzeczy:
* Intellisense działa tak samo z czapki jak za dawnych lat. Kiedyś aby sobie z tym poradzić namówiłem pracodawcę na zakup Borland Together, który naprawiał to i wiele innych rzeczy. Teraz zrobiłem sobie proste macro, które mi przebudowuje bibliotekę.
Jak wygląda macro? Tak:

    Sub IntellisenseFixerMacro()

       Dim solutionIntelliBase = DTE.Solution.FullName.Substring(0, DTE.Solution.FullName.LastIndexOf(".")) & ".ncb"
        Dim solutionName = DTE.Solution.FullName

        DTE.Solution.Close(True)

        FileIO.FileSystem.DeleteFile(solutionIntelliBase)

        DTE.Solution.Open(solutionName)

        DTE.Solution.SolutionBuild.Build(True)

        MsgBox("Intellisense database was rebuilt successfully!")

    End Sub

 

 

Co robi macro? usuwa plik .ncb. Zgodnie z instrukcją z MSDN Library, plik .ncb z biblioteka danych do intellisense jest zawsze odbudowany gdy zostanie usunięty. Dzieje się to przy pierwszym buildzie. Operacja się kompikuje gdy Visual Studio z otwartym projektem trzyma łapę na pliku i nie można z nim nic zrobić dopóki rozwiązanie nie zostanie zamknięte. Macro automatyzuje proces wyjścia z VS, odszukania pliku w shellu, usunięcia, powrotu do VS i ponownego otwarcia projektu + build. Brzydkie, ale działa.

* Testy, no ja już bez nich żyć nie mogę. W Native C++ - nie są wspierane. Można kombinować z mix'owanym projektem i /clr ale po co.. chciałbym mieć to zintegrowane.

* FxCop był fajny? Zintegrowana funkcjonalność Analizy kodu w VS Team Edition Ci się podoba? Chcesz to zastosować w C++ ha.. error: only managed C++ supported.

* Jak widać po powyższym obrazku: diagramów nauczyłem się używać, ale w pierwszej konfrontacji miałem kompletnie inny pomysł jakbym to chciał widzieć w VS. 

Generalnie jak zawsze uważałem i uważam, że Visual Studio to środowisko kompletne tak z perspektywy programowania w C++ i porównaniu z .NET Framework jestem trochę zawiedziony z jednej strony, z drugiej chyba mimo wszystko niezbyt zaskoczony.

Jak wspomniałem, jest jeszcze wiele dziedzin, gdzie managed code może nie jest najlepszym rozwiąznaniem, ale w przypadku aplikacji biznesowej w życiu bym się nie zdecydował na rozpoczynanie teraz projektu w C++ 

Nostalgia<CPP> mojaNostalgia(NO_CO_TY_MAMUTY_PRZECIEZ_NIE_WYGINELY,TRUE);
mojaNostalgia.Kill(FOREVER);

Technorati Tagi: Polish posts,coding,babbling,C++