sieht so professioneller code aus???



  • Als Hobby-Programmierer und 12%-Informatiker (2.Semester) frage ich mich auch oft wie profesioneller Code auszusehen hat.
    Oftmals verschwende ich Stunden damit eine optimale Objektorientierte Lösung zu finden. Umso frustrierender wenn man am nächsten Tag Code von Profis liest (sei es in nem Buch oder hier) und feststellt, dass es eine weitaus einfacherer und sauberere Lösung gibt.

    Auf der anderen Seite verwundert mich der Programmierstil von so manchen Gurus auch hin und wieder. Man schaue sich nur mal den Code von John Carmack an. Sowas von unübersichtlich und undurchschaubar...
    Und trotzdem sind seine Programme (Spiele) Referenzprodukte in allen Belangen.

    Das wirft die Frage auf was wichtiger ist: Guter Programmierstil oder das Resultat ?



  • Original erstellt von Space^qx:
    Das wirft die Frage auf was wichtiger ist: Guter Programmierstil oder das Resultat ?

    Kann man nicht sagen. Zuerst zaehlt natuerlich mal das resultat! Aber dann kommt auch gleich dahinter schon die wartbarkeit vom Code und das geht nur bei einem ordentlichen Programmierstil.

    Ich habe noch keine Source von Carmack gesehen, aber die 'Gurus' von denen ich source gesehen haben, von denen schauts immer gut aus 🙂



  • Hi,

    Japros Beispiel kann man noch gut lesen, aber das hab ich mal aus der STL-Implementierung des MSVC6
    kopiert :

    template<class _RI, class _Ty> inline
        void _Sort_0(_RI _F, _RI _L, _Ty *)
        {if (_L - _F <= _SORT_MAX)
            _Insertion_sort(_F, _L);
        else
            {_Sort(_F, _L, (_Ty *)0);
            _Insertion_sort(_F, _F + _SORT_MAX);
            for (_F += _SORT_MAX; _F != _L; ++_F)
                _Unguarded_insert(_F, _Ty(*_F)); }}
    template<class _BI, class _Pr> inline
        _BI partition(_BI _F, _BI _L, _Pr _P)
        {for (; ; ++_F)
            {for (; _F != _L && _P(*_F); ++_F)
                ;
            if (_F == _L)
                break;
            for (; _F != --_L && !_P(*_L); )
                ;
            if (_F == _L)
                break;
            iter_swap(_F, _L); }
        return (_F); }
    

    Und das geht seitenweise so.
    Oder sowas :

    template<class _RI, class _Pd, class _Ty> inline
        void _Rotate(_RI _F, _RI _M, _RI _L, _Pd *, _Ty *)
        {_Pd _D = _M - _F;
        _Pd _N = _L - _F;
        for (_Pd _I = _D; _I != 0; )
            {_Pd _J = _N % _I;
            _N = _I, _I = _J; }
        if (_N < _L - _F)
            for (; 0 < _N; --_N)
                {_RI _X = _F + _N;
                _RI _Y = _X;
                _Ty _V = *_X;
                _RI _Z = _Y + _D == _L ? _F : _Y + _D;
                while (_Z != _X)
                    {*_Y = *_Z;
                    _Y = _Z;
                    _Z = _D < _L - _Z ? _Z + _D
                        : _F + (_D - (_L - _Z)); }
                *_Y = _V; }}
    

    Alles hinter solchen unverständlichen Namen verborgen, und dabei lese ich überall man solle doch aussagekräftige Namen vergeben, ja die Namen der Funktionen klingen gut ( random_shuffle, sort, remove_if,
    for_each ), aber der Implementierungscode sieht echt nur noch verwirrend aus.
    Also wenn so professioneller Code aussieht / aussehen soll dann hoffe ich nur keinen Job als Programmierer
    zu bekommen.

    [ Dieser Beitrag wurde am 05.07.2002 um 02:24 Uhr von Real_PsychoDAD editiert. ]



  • ich gestehe. ich verwende auch hin und wieder den hässlichen "_" aber im momentanen project nur bei classen namen und den dazugehörigen dateinahmen. ein kleines beispiel:

    class DLL_Manager ; ist z.b die managerklasse aus dem programmpacket DLL ( hir auch als DLL implementiert )

    oder

    class IF_Manager ; ist auch eine managerklasse nur aus dem programmpacket IF ( IF steht bei mir für InterFace, damals nichts besseres eingefallen. diese klassen sind alle abstrackt und dienen wie gesagt nur als interface)

    meist leg ich auch noch für jede klasse nen typedef für den Pointer an

    typdef DLL_Manager* p_DLL_Manager;

    ich weiss zwar nicht ob das leserlich ist. ich weis zumindestens was was ist und wie ich das zu deuten habe.

    gruss termite



  • Original erstellt von Termite:
    **
    typdef DLL_Manager* p_DLL_Manager;
    **

    die _ in den namen drinn stören mich überhaupt nicht. so nenne ich z.b. alle meine eigenen typen in der art nummer_t, meintyp_t etc.
    aber die vorangestellten find ich grässlich besonders wenn man dann sowas sieht:
    --__a;



  • @japro
    Was noch dazu kommt: Mit doppelten Underscores oder Aehnlichem solltest Du auch gar nix machen. Aus dem Standard:
    17:4.3.1.2:

    [...]- Each name that contains a double underscore (__) or begins with an underscore followes by an uppercase letter is reserved to the implementation for any use.
    - Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace. Such names are also reserved in Namespace ::std.



  • @virtual
    Das ist tatsächlich eindeutig besser formuliert als mein umgangssprachliches Geholpere 🙂



  • Ich schätz mal, dass da sogar ein bisschen Absicht dahintersteckt, wenn die stl möglichst unleserlich geproggt ist. Es tut den Firmen wahrscheinlich sowieso schon weh, dass sie wegen dem Template-Zeugs den kompletten Quellcode mitliefern müssen ...



  • @kartoffelsack: Ich wollte mir mal die Stream-Bibliothek der MSVC-Libary näher ansehen - damals wollte ich eine eigene bauen. Nur leider kann man da überhaupt nix erkennen. Da werden nur einbuchstabrige Variablen hin und her geschaukelt, und alles endet irgendwo in einem Header mit einem 'x' am Anfang :(.

    MfG SideWinder



  • wahrscheinlich haben die eine art parser der das so unläserlich macht

    [ Dieser Beitrag wurde am 05.07.2002 um 11:46 Uhr von Dimah editiert. ]



  • ich denke mal die stl implementeure wussten nicht genau was sie machen und haben deshalb eben so dummy variablen genommen, weil sie den eigentlichen sinn der variable nicht verstanden haben



  • @dimah
    du meinst vermutlich sowas wie cfog, zu finden z.B. hier:
    http://www.norfolk.navy.mil/oasys/c/files.html
    Die machen IHMO aber richtig krassen output.

    @iknow
    Also IMHO wissen die Jungs und Mädels schon sehr genau, was sie so machen. Meistens jedenfalls. 😉



  • Original erstellt von virtual:
    **@dimah
    du meinst vermutlich sowas wie cfog, zu finden z.B. hier:
    http://www.norfolk.navy.mil/oasys/c/files.html
    Die machen IHMO aber richtig krassen output.
    **

    heist das das der code noch schlimmer aussehen würde wenn sie ihn durch solch ein paser laufen lassen würden? oder hatten die nicht so viel zeit ein guten zu schreiben? oder es gibt menschen die wirklich so progen 😮 vieleicht sehen sie es als cool an 😕 zum glück denke ich genau anders rum



  • @dimah
    Aus dem Manual von dem Teil

    o uses your system's C preprocessor to incorporate the contents of include files into the source file and execute all preprocessor directives. By default, FOG only processes local include files and does not process system include files.

    o replaces all identifier names (including function names) with a generic style of name--by default this is i_dn where n is a number that is different for every unique identifier.

    o "octalizes" strings. The characters in all character strings in the file (e.g., those in printf statements) are replaced with their octal equivalents; i.e., "hello world" becomes "\150\145\154\154\157\40\167\157\162\154\144".

    o removes comments.

    o removes the physical structure of the program.

    Eben alles, was das Herz begehrt. 😉



  • Bei der STL find ich das nicht so schlimm, weil der Code eh unwichtig ist, schließlich will ich sie nur benutzen. Ich will sie ja nicht verändern oder erweitern, denn das wäre ziehmlich dumm. Anders bei Open-Source Projekten wo man sich mal da und dort die einzelnen Klassen Funktion hohlt um sie in seinem Programm einzusetzten. Hier will man evt. das ein oder andere ändern, oder sich den Code schlicht zum verstehen was die Klasse macht angucken. Die STL ist da ausreichen dokumentiert.



  • Original erstellt von Lars Skiba:
    Bei der STL find ich das nicht so schlimm, weil der Code eh unwichtig ist, schließlich will ich sie nur benutzen. Ich will sie ja nicht verändern oder erweitern, denn das wäre ziehmlich dumm. Anders bei Open-Source Projekten wo man sich mal da und dort die einzelnen Klassen Funktion hohlt um sie in seinem Programm einzusetzten. Hier will man evt. das ein oder andere ändern, oder sich den Code schlicht zum verstehen was die Klasse macht angucken. Die STL ist da ausreichen dokumentiert.

    Hmm, wieso sollte man die STL nicht erweitern können/dürfen/sollen? Allerdings benötigt man zum Erweitern ziemlich selten die Implementierung ... da reicht die Dekleration und das Wissen über die einzelne Klasse/Methode.

    Aber wer solchen Code bei OpenSource-Projekten einsetzt ... hmm, der kann einen leid tun.

    MfG SideWinder



  • Hi.

    Gestehe Termite!

    Original erstellt von Termite:
    **ich gestehe.
    **

    Gut :).
    Wo waren sie in der Nacht zu gestern zwischen 4:00 und 5:00?

    **
    ich verwende auch hin und wieder den hässlichen "_" aber im momentanen project nur bei classen namen und den dazugehörigen dateinahmen.
    **

    *würg*
    Bei mir kommt sowas nicht in den Quelltext :).

    **
    class IF_Manager ; ist auch eine managerklasse nur aus dem programmpacket IF ( IF steht bei mir für InterFace, damals nichts besseres eingefallen. diese klassen sind alle abstrackt und dienen wie gesagt nur als interface)
    **

    this sagt: IManager (I steht für Interface ;)).

    **
    meist leg ich auch noch für jede klasse nen typedef für den Pointer an

    typdef DLL_Manager* p_DLL_Manager;
    **

    Unter C++ sind also Instancen von Objekten nicht gleich Zeiger?
    Heißt das etwa, das bei Übergabe dieser Instanz an eine Funktion das gesamte Objekt über den Heap übergeben wird (sprich: neuer Speicher auf dem Heap reserviert und Objekt hineinkopiert)?

    **
    ich weiss zwar nicht ob das leserlich ist. ich weis zumindestens was was ist und wie ich das zu deuten habe.
    **

    Ich weiß von nix =).
    Aber wenn ich Zeiger auf Typen verwende, schreibe ich meist nur ein P davor.
    Diese "_" entfallen, da in Pascal verpöhnt.

    MfG other.

    [ Dieser Beitrag wurde am 05.07.2002 um 14:18 Uhr von other editiert. ]



  • Original erstellt von japro:
    sieht so professioneller code aus

    jo. leider.
    sagte ich nicht irgendwo, daß die stl eigentlich müll ist?
    Also nicht wirklich müll, aber ein kind ihrer zeit.



  • Unter C++ sind also Instancen von Objekten nicht gleich Zeiger?

    Nö.

    Heißt das etwa, das bei Übergabe dieser Instanz an eine Funktion das gesamte Objekt über den Heap übergeben wird (sprich: neuer Speicher auf dem Heap reserviert und Objekt hineinkopiert)?

    Nö. Nicht zwangsläufig.
    In C++ hast du die freie Wahl wie wo was angelegt wird und wie was übergeben wird.

    Bei der Wertübergabe wird der Copy-Ctor des Objekts aufgerufen. Dabei ensteht also eine Kopie (die aber nicht auf dem Heap liegen muss. Der Stack tuts auch). Wenn das zu teuer/nicht erwünscht ist, dann übergibt man Objekte per Referenz (entweder über einen Zeiger oder direkt unter der Verwendung einer Referenz).

    sagte ich nicht irgendwo, daß die stl eigentlich müll ist?
    Also nicht wirklich müll, aber ein kind ihrer zeit.

    Ich halte die STL ja noch wie vor für ein geniales Stück Softwaredesign. Bin aber natürlich wie immer für deine Einwände offen.

    Was meinst du mit "kind ihrer zeit"?
    Geht es um eine spezielle Implementation oder um das allgemeine Konzept?
    Gibt es in deinen Augen eine ähnlich gute Bibliothek (z.B. das Java-Collection-Framework)? Und wenn ja, was zeichnet diese Lib gegenüber der STL aus?
    Was sind die Schwächen der STL?



  • Ich weigere mich ganz einfach, einzusehen, daß Code wie

    struct DeletePtr
    {
        template <class T>
        void operator()(T* p) const
        {
            delete p;
            p = 0;
        }
    
    };
    ...
        for_each(Vec.begin(), Vec.end(), DeletePtr());
    

    In irgend einer Weise besser lesbar oder wartbar ist als

    for(vector<Base*>::iterator i=Vec.begin();i!=Vec.end();++i)
           delete *i;
    

    Sie ist irgendwie unhandlich. Es macht mir keine Freude, sie zu verwenden.


Anmelden zum Antworten