Schöner Code?



  • Ich hab mich mal ein wenig umgeschaut, eigentlich soll Code ja lesbar sein. Findet ihr das hier gut lesbar:

    template<class _FI1, class _Pd2, class _Ty, class _Pd1> inline
    	_FI1 _Search_n(_FI1 _F1, _FI1 _L1,
    		_Pd2 _N, const _Ty& _V, _Pd1 *)
    	{_Pd1 _D1 = 0;
    	_Distance(_F1, _L1, _D1);
    	for (; _N <= _D1; ++_F1, --_D1)
    		{_FI1 _X1 = _F1;
    		for (_Pd2 _D2 = _N; ; ++_X1, --_D2)
    			if (_D2 == 0)
    				return (_F1);
    			else if (!(*_X1 == _V))
    				break; }
    	return (_L1); }
    

    ?
    Hätte man das nicht evt. anders lösen können (andere Bezeichner?)



  • Hallo,

    ist die Frage ernst gemeint?

    Falls ja: Nein, das wird außer dir niemand verstehen, es sei denn er ist Kryptologe.



  • sieht mir irgendwie sehr nach STL code aus..
    und falls er das is:
    den soll man eh nich lesen können 😛
    (und das mit den _ hat seinen Sinn)



  • CarstenJ schrieb:

    Hallo,

    ist die Frage ernst gemeint?

    Falls ja: Nein, das wird außer dir niemand verstehen, es sei denn er ist Kryptologe.

    Ja, die Frage ist ernst gemeint, dass ist aber nicht mein Code sondern STL-Code.

    "[...]den soll man eh nich lesen können [...]"

    Ist das jetzt ernst gemeint 😃 ?



  • k1ro schrieb:

    (und das mit den _ hat seinen Sinn)

    wäre ja noch schöner, wenn nicht... und welchen Sinn hat es?





  • nur weil's für den Compilerbauer reserviert ist, muss der ja nicht gleich überall sowas machen.



  • @Greenthumb

    ja, ne, is klar,
    nur... ach, lies mal seinen letzten post 😉

    ohha schrieb:

    dass ist aber nicht mein Code sondern STL-Code.



  • ohha schrieb:

    template<class _FI1, class _Pd2, class _Ty, class _Pd1> inline
    	_FI1 _Search_n(_FI1 _F1, _FI1 _L1,
    ...
    

    Hätte man das nicht evt. anders lösen können (andere Bezeichner?)

    ja, sieht aus wie stl-code. der wird bestimmt maschinell generiert (aus uml-diagrammen oder sowas).



  • k1ro schrieb:

    @Greenthumb

    ja, ne, is klar,
    nur... ach, lies mal seinen letzten post 😉

    ohha schrieb:

    dass ist aber nicht mein Code sondern STL-Code.

    war mir schon klar. mit "muss der ja nicht gleich überall sowas machen", meine ich auch, den Compilerbauer.
    An maschinen-generierten Code glaube ich nicht.



  • aaachso,
    dann hab ich dich falsch verstanden, sry



  • Theoretisch müssten die STL-Implementierer doch alles, was intern oder lokal ist, nennen dürfen, wie sie wollen? 😕

    Aber ist halt so mehr 1337 h4x0r. 🙄



  • Wie kann man ernsthaft fragen, ob das schöner Code ist? 😕



  • GAH! Das liest sich wie die Microsoft-STL-Implementierung des VC++ 6.0 - die auch dementsprechend gut (bzw. schlecht) funktionierte.

    Um die Frage zu beantworten: JA! Der Code ist sogar verdammt hässlich. Wenn du ne STL lesen willst, um die Interna zu verstehen, nimm die GNU libstdc++. Oder meinetwegen auch STLPort, obwohl die aus Kompatibilitätsgründen (STLPort will mit allen Compilern laufen) teilweise recht seltsame Präprozessor-Konstruktionen drin haben.

    Wenn ich diesen speziellen Code richtig verstehe, dann sollte das eigentlich so heißen:

    template<typename iterator_t, 
    	 typename count_t, 
    	 typename content_t, 
    	 typename distance_t> 
    inline iterator_t _Search_n(iterator_t first, 
    			    iterator_t nil, //not in list - direkt hinter dem Ende des Bereichs
    			    count_t num,
    			    const content_t& val,
    			    distance_t *unused) {
      distance_t len = 0;
      _Distance(first, nil, len); //Irgendein Makro. Peusocode: len = last-first;
    
      for (; len >= num; ++first, --len) {
        iter_t pos = first;
        for (count_t num_found = 0; ; ++pos, ++num_found)
          if (num_found == num)
            return first;
          else if (!(*pos == val))
            break; 
      }
    
      return nil; 
    }
    

    Das ist ein ziemlich ineffizienter Algorithmus, um einen gegebenen Wert in einer gegebenen Folge n-mal hintereinander zu finden. Ich persönlich hätte es eher so geschrieben:

    template<typename iterator_t,
    	 typename count_t,
    	 typename content_t>
    inline iterator_t search_n(iterator_t first,
    			   iterator_t nil,
    			   count_t num,
    			   content const &val) {
      count_t num_found = 0;
    
      for(iterator_t pos = first;
          (nil - pos) - num_found >= num; //nil - pos ist Pseudocode, aber da es
          ++pos) {                        //ja scheinbar ne Funktion gibt, die den
        if(*pos == val)                   //Abstand zweier Iteratoren zurück gibt,
          ++num_found;                    //die halt einfach hier einsetzen.
        else
          num_found = 0;
    
        if(num_found == num)
          return pos;
      }
      return nil;
    }
    

    Das ist zwar nur so hingekladdet, aber ich glaube, dass es laufen sollte.


Anmelden zum Antworten