402 Stimmen

Was sind fünf Dinge, die Sie an Ihrer Lieblingssprache hassen?

Es gab in letzter Zeit eine Häufung von Perl-Hass auf Stack Overflow, also dachte ich, ich bringe meine " Fünf Dinge, die Sie an Ihrer Lieblingssprache hassen " Frage an Stack Overflow. Nimm deine Lieblingssprache und nenne mir fünf Dinge, die du an ihr hasst. Das können Dinge sein, die Sie einfach nur ärgern, zugegebene Designfehler, erkannte Leistungsprobleme oder jede andere Kategorie. Sie müssen sie nur hassen, und es muss Ihre Lieblingssprache sein.

Vergleichen Sie sie nicht mit einer anderen Sprache, und sprechen Sie nicht über Sprachen, die Sie bereits hassen. Sprechen Sie nicht über die Dinge, die Sie an Ihrer Lieblingssprache mögen. Ich möchte nur die Dinge hören, die du hasst, aber tolerierst, damit du all die anderen Dinge benutzen kannst, und ich möchte etwas über die Sprache hören, von der du dir wünschst, dass andere Leute sie benutzen würden.

Diese Frage stelle ich immer dann, wenn mir jemand seine Lieblingssprache aufdrängen will, und manchmal auch als Interviewfrage. Wenn jemand keine fünf Dinge findet, die er an seinem Lieblingstool hassen kann, kennt er es nicht gut genug, um es entweder zu befürworten oder das große Geld damit zu machen. Er hat es nicht in genügend verschiedenen Situationen eingesetzt, um es vollständig zu erforschen. Er befürwortet sie als Kultur oder Religion, was bedeutet, dass ich falsch liege, wenn ich nicht seine Lieblingstechnologie wähle.

Es ist mir nicht so wichtig, welche Sprache Sie verwenden. Sie wollen eine bestimmte Sprache nicht verwenden? Dann tun Sie es nicht. Sie haben sich nach bestem Wissen und Gewissen für eine Sprache entschieden und verwenden sie trotzdem nicht? Kein Problem. Manchmal lautet die richtige Antwort: "Sie haben ein starkes Programmierteam mit guten Praktiken und viel Erfahrung mit Bar. Zu Foo zu wechseln wäre dumm."


Dies ist auch eine gute Frage für Code Reviews. Leute, die eine Codebasis wirklich kennen, haben alle möglichen Vorschläge für sie, und diejenigen, die sie nicht so gut kennen, haben unspezifische Beschwerden. Ich frage Dinge wie "Wenn Sie bei diesem Projekt noch einmal von vorne anfangen könnten, was würden Sie anders machen?" In dieser Fantasiewelt können sich Benutzer und Programmierer über alles und jeden beschweren, der ihnen nicht gefällt. "Ich möchte eine bessere Schnittstelle", "Ich möchte das Modell von der Ansicht trennen", "Ich würde dieses Modul anstelle dieses anderen verwenden", "Ich würde diese Methoden umbenennen", oder was auch immer ihnen an der aktuellen Situation nicht gefällt. Auf diese Weise bekomme ich einen Eindruck davon, wie viel ein bestimmter Entwickler über die Codebasis weiß. Es ist auch ein Anhaltspunkt dafür, wie viel vom Ego des Programmierers in dem steckt, was er mir erzählt.

Hass ist nicht die einzige Dimension, um herauszufinden, wie viel Menschen wissen, aber ich habe festgestellt, dass sie eine ziemlich gute ist. Die Dinge, die sie hassen, geben mir auch einen Hinweis darauf, wie gut sie über ein Thema nachdenken.

72voto

Brad Gilbert Punkte 33120

Perl

  • Gemischte Verwendung von Siegeln

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    • Zum Beispiel keine von diesen sind die gleichen:

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'

    En Perl6 es ist geschrieben :

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
  • Fehlen von echtem OO

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }

    En Perl6 es ist geschrieben :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
  • Schlecht gestaltete Regex-Funktionen

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code

    En Perl6 es ist geschrieben :

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
  • Fehlen von Mehrfachversand

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful

    En Perl6 es ist geschrieben :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
  • Schlecht Überlastung des Bedieners

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;

    En Perl6 es ist geschrieben :

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }

57voto

Ich werde es tun PHP wie ich es manchmal mag und Python wird viel zu oft gemacht.

  • Kein Namespace; alles befindet sich in einer einer Art sehr großem Namensraum, der in in größeren Umgebungen die Hölle ist

  • Fehlende Standards in Bezug auf Funktionen: Array-Funktionen nehmen eine Nadel als erstes Argument, Heuhaufen als zweites Argument (siehe array_search ). String-Funktionen nehmen oft die Heuhaufen als erstes, die Nadel als zweites (siehe strpos ). Andere Funktionen verwenden einfach andere Namensschemata verwenden: bin2hex , strtolower , cal_to_jd

    Einige Funktionen haben seltsame Rückgaben Werte, die nicht normal sind: Diese zwingt Sie dazu, eine dritte Variable aus dem Nichts zu deklarieren, während PHP effizient ein leeres Array effizient als falsch interpretieren kann, indem es mit dem Typ jonglieren. Es gibt fast keine anderen Funktionen, die das Gleiche tun.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
  • Die Sprache (bis PHP6) macht ihre das Beste, um eine fast zurückgebliebene Rückwärtskompatibilität zu respektieren, was es schlechte Praktiken und Funktionen mit sich herumtragen, wenn sie nicht benötigt werden (siehe mysql_escape_string vs. mysql_real_escape_string ).

  • Die Sprache entwickelte sich aus einem Schablonensprache zu einer vollwertigen Backend-Sprache. Das bedeutet, dass jeder kann alles ausgeben, wann er will, und es wird missbraucht. Sie enden mit Template-Engines für eine Templating Sprache...

  • Es ist schlecht beim Importieren von Dateien. Sie haben 4 verschiedene Möglichkeiten, dies zu tun (include, include_once, require, require_once), sie sind alle langsam, sehr langsam. Tatsächlich ist die ganze Sprache ist langsam. Zumindest ziemlich langsamer als Python (sogar mit einem Framework) und RoR, soweit ich weiß sammeln.

Ich mag PHP aber immer noch. Es ist die Kettensäge der Webentwicklung: Sie wollen eine kleine bis mittelgroße Website schnell erstellen und sicher sein, dass jeder sie hosten kann (obwohl die Konfigurationen unterschiedlich sein können)? PHP ist genau das Richtige, und es ist so allgegenwärtig, dass es nur 5 Minuten dauert, einen kompletten LAMP- oder WAMP-Stack zu installieren. Nun, ich werde jetzt wieder mit Python arbeiten...

50voto

Dónal Punkte 180956

Hier sind einige Dinge, die ich an Java (das nicht meine Lieblingssprache ist) nicht mag:

  • Generics type erasure (d.h. keine verifizierten Generika)
  • Unmöglichkeit, mehrere Ausnahmen (unterschiedlicher Typen) in einem einzigen Catch-Block abzufangen
  • Fehlen von Destruktoren (finalize() ist ein sehr schlechter Ersatz)
  • Keine Unterstützung für Abschlüsse oder Behandlung von Funktionen als Daten (anonyme innere Klassen sind ein sehr ausführlicher Ersatz)
  • Überprüfte Ausnahmen im Allgemeinen, oder genauer gesagt, Überprüfung von nicht behebbaren Ausnahmen (z. B. SQLException)
  • Keine Unterstützung auf Sprachebene für wörtliche Sammlungen
  • Keine Typinferenz beim Aufruf von Konstruktoren generischer Klassen, d.h. der/die Typparameter müssen auf beiden Seiten des '=' wiederholt werden

40voto

grieve Punkte 12440

C++

  1. Vorlage Syntax
  2. Fragen der Diamantenvererbung
  3. Die Fülle bzw. das Fehlen von Standardbibliotheken, die moderne Sprachen haben (obwohl Boost nahe dran ist).
  4. IOStreams
  5. Die für IOStreams verwendete Syntax

Python

  1. Leerzeichen sind (manchmal) sinnvoll
  2. unterstrichene Schlüsselwörter
  3. Eingeschränkte Thread-Unterstützung (zumindest derzeit)
  4. "selbst" statt "dies"
  5. Leerzeichen sind (manchmal) sinnvoll

37voto

Objektiv-C

1) Keine Namespaces, nur manuelle Namenskonventionen - das macht mir nichts aus, was die Klassentrennung angeht, aber ich vermisse die Möglichkeit, alle Klassendefinitionen in einem Namespace in einer einzigen Zeile zu importieren (z. B. import com.me.somelibrary.*).

2) Die Bibliotheken haben noch einige Lücken in wichtigen Bereichen wie der RegEx-Unterstützung.

3) Die Eigenschaftssyntax ist etwas umständlich und erfordert drei Zeilen (in zwei separaten Dateien), um eine Eigenschaft zu deklarieren.

4) Ich mag das Modell der Beibehaltung/Freigabe, aber es ist einfacher als es sein sollte, eine Referenz freizugeben und sie dann später versehentlich zu verwenden.

5) Obwohl es sich nicht wirklich um ein Sprachfeature handelt, ist Xcode so sehr mit der Verwendung von Objective-C verflochten, dass ich nicht umhin kann, über diesen Aspekt nachzudenken... im Grunde ist die Autovervollständigung sehr unzuverlässig. Es ist eher wie ein System, das einen belohnt, wenn man etwas findet, das man haben will, und es dann als Auswahlmöglichkeit anbietet. Aber ich glaube, ich habe Autovervollständigungssysteme noch nie gemocht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X