Ich bin ein C ++ - Programmierer und bin kürzlich einer neuen Firma beigetreten, die viel C verwendet. Als sie meinen Code überprüft haben, dachten sie, ich übertrumpfe einige der Dinge, denen ich völlig widersprach. Das Unternehmen macht alles im Embedded-System, also muss mein Code Speicher sein
effizient, aber das Zeug, das ich mache, ist nicht CPU-intensiv. Ich würde gerne wissen, wie Sie denken, was mein Design ist. Hier ist die Liste.
Ich habe einige Arrays, die übergeben werden müssen und eventuell an einen C-Code übergeben werden müssen. Ich könnte überall einen Zeiger und eine Größe übergeben. Aber ich habe mich entschieden, eine Klasse zu erstellen, die das repräsentiert - eine Klasse mit einer festen Größe (wir kennen die maximale Größe), und eine Länge, die immer & lt; = die Größe des Puffers sein sollte, andernfalls wird behauptet. Auf diese Weise kann ich das Array mit nur einer Variablen anstelle von zwei übergeben, und wenn sich die maximale Größe in der Zukunft ändert, sollte ich in der Lage sein, es leicht zu ändern. Ich verwende keine dynamische Zuordnung für das Array, weil es eingebettete System- und Speicherzuweisung möglicherweise fehlschlagen kann und wir keine Ausnahme verwenden. Die Klasse ist wahrscheinlich weniger als 30 Zeilen Code, und ich benutze es für einige Stellen. Sie sagten, ich habe es über-entworfen.
Sie haben ihre eigene Containerimplementierung in C. Ich musste eine davon verwenden, aber ich wollte den ganzen detaillierten Code außerhalb meiner Hauptlogik verstecken, also habe ich eine Wrapper-Klasse erstellt dafür. Die Wrapper-Klasse ist ähnlich wie stl, also habe ich Iteratoren und es verwaltet den Speicher Zuweisung intern, aber im Gegensatz zu Stl, gibt es einen Fehlercode, wenn es nicht mehr zuordnen kann Erinnerung. Ihr Argument ist, dass ich der Einzige bin, der es benutzt, also wollen sie nicht, dass es im Repository ist. Ich fand es dumm, um ehrlich zu sein.
EDIT: Die folgende Klasse ist mehr oder weniger die, die ich für Punkt 1 verwendet habe. Alles was ich tun wollte, ist etwas zu haben, um herumzugehen, ohne die ganze Länge zu tragen.
%Vor%Sie haben wahrscheinlich recht, aber andererseits, wenn jeder in der Firma entschieden hat, dass sie die vorhandenen APIs nicht mögen und jeder seine eigenen Shims und Hilfsfunktionen entwickelt hat, die nur sie benutzen, wäre die Wartung schwierig .
Wenn Ihr Array-Wrapper "überdesignt" ist, würde ich in Frage stellen, ob der Code-Reviewer eine beliebige Menge an Design für akzeptabel hält. Es sieht für mich harmlos aus [*]. Ich nehme an, Sie hätten es einfach zu einer Struktur mit zwei öffentlichen Mitgliedern machen können und den Vorteil der Lesbarkeit verlieren. Wie scharf sind Ihre Kollegen auf Korrektheit im Allgemeinen?
Ich denke, das Ziel von 2 sollte darin bestehen, einen Konsens darüber zu erzielen, ob diese C-API direkt aus C ++ verwendet oder umschlossen werden sollte. Wenn es umgebrochen werden sollte (und die Argumente hierfür wahrscheinlich ziemlich stark sind, was mit Namespacing und RAII), entwerfen Sie einen Wrapper, den jeder verwenden wird, und bezeichnen Sie ihn als "die C ++ - API für dieses Modul" und nicht als einen C ++ - Wrapper Modul verwendet für dieses andere Modul ".
Es ist möglich, dass alle anderen die API wirklich so bevorzugen, wie sie ist, über eine OO-API oder über STL. Die Einhaltung ihrer Konventionen macht es für sie am einfachsten, den Code zu pflegen, solange ihre Konventionen einen soliden C-Programmierstil haben. C ++ ist eine Multi-Paradigma-Sprache, und "C mit einer begrenzten Anzahl von Schnickschnack" ist nicht das Paradigma, das Sie gewohnt sind. Aber es ist ein gültiges Paradigma, und wenn es das ist, was die bestehende Codebasis verwendet, dann müssen Sie sich fragen, ob das, was Ihr Unternehmen gerade braucht, eine Ein-Mann-Revolution ist, wie aufgeklärt diese auch sein mag.
[*] (das heißt, die API. Sie könnten in Frage stellen, ob es unangemessen an Wert weitergegeben wird und ob es sinnvoll ist, dass jede Instanz so groß wie die größte sein muss. Das ist alles, worüber Sie streiten können der Reviewer, hat aber nichts mit "over-design" zu tun.
Das Wichtigste zuerst: Du bist einer neuen Firma beigetreten, also kannst du erwarten, dass du lernen musst, nach ihren Regeln zu spielen. Du bist immer noch "der neue Typ" und es wird etwas Widerstand gegen "deinen Weg" sein, Dinge zu tun, auch wenn es besser ist. Gewöhne dich daran und integriere dich und deine Ideen langsam.
Wie bei # 1 ist es für den Programmierer sicherlich ein Schmerz, einen Zeiger + Größe zu übergeben, aber es ist die speicherfreundlichste Art, Dinge zu tun. Deine Klasse ist nicht "over" -designed, aber was passiert, wenn MAXSIZE irgendwann wirklich groß wird? Alle Ihre Instanzen benötigen jeweils so viel Speicherplatz, auch wenn sie dies nicht benötigen. Es könnte passieren, dass Sie keinen Platz mehr haben, nur weil sich MAXSIZE geändert hat, selbst wenn nichts so viel Platz benötigt.
Wie bei # 2, ist es ein Tossup darüber, ob es eine unnötige Ebene ist (vielleicht wäre es besser dafür geeignet, ihren Wrapper zu verbessern, anstatt ihn einfach wieder zu umhüllen?), aber das hängt davon ab, wie gut Sie sich mit ihnen integrieren und Vorschläge machen.
Zusammenfassend würde ich es nicht "overdesigned" nennen, aber in einer eingebetteten Situation müssen Sie sehr vorsichtig sein, Code zu verallgemeinern, um sich Mühe zu sparen und Speicher zu sparen.
Ein C ++ Wrapper für die bereits existierende c-style Container-Bibliothek ist eine gute Sache. Aber stellen Sie sicher, es ist wirklich ein Wrapper, kein Wrapper mit verschraubten Schnickschnack.
Wenn Sie alle Ihre Zugriffsfunktionen als Inline deklarieren und Ihren Wrapper mit einer möglichst schlanken Implementierung schreiben, sollte der Code und die Datengröße genau null sein.
Ein solcher Wrapper gibt Ihnen nur eine klassenähnliche Schnittstelle zur c-Bibliothek, und das ist eine gute Übung für ein C / C ++ - Projekt.
Ich schlage vor, Ihren Code zu überprüfen. Werfen Sie einen Blick auf die Zerlegung eines kleinen Testfalls mit Ihrem Wrapper und vergleichen Sie ihn mit einer reinen c-Implementierung. Wenn Sie zusätzliche Komplexität, Zuordnungen oder Aufrufe Ihrer Klassenimplementierung sehen, haben Sie einen Overhead und vielleicht ein wenig überentwickelt.
Wenn Sie beweisen, dass Ihr Wrapper im Vergleich zur c-Version mehr oder weniger identischen Code erzeugt, können Sie die anderen Programmierer davon überzeugen, dass ein Wrapper hier und da keinen Schaden anrichtet. Es folgt der Art, wie C ++ - Programme geschrieben werden und führt zu einer saubereren und konsistenteren Codebasis.
Btw - Die "wir wollen keine nutzlose Wrapper-Klasse in unserem Repository" ist ein soziales Problem, kein technisches Problem. Du bist der neue Typ. Wenn ich in Ihrer Position wäre, würde ich für ein paar Monate nach ihren Regeln spielen und - nachdem ich mich selbst bewiesen habe - sie Ihren Ideen vorstellen.
Auf der einen Seite, wenn Sie mit C ++ vertraut sind und sie C verwenden, dann sind Helfer-Klassen wahrscheinlich eine gute Sache, zumindest für Sie. Wenn Sie dagegen eine Art von Containerklasse schreiben, sollten Sie STL lieber direkt verwenden und eine Helfer -Funktion schreiben, um die Lücke zwischen Ihrem STL-Container und dem C-Code zu schließen . Erfinde das Rad nicht neu.
"Over designed" ist sehr relativ. Die C-Typen in Ihrer Gruppe sehen wahrscheinlich ein Problem mit Ihrer Klasse, denn wenn Sie Ihre Klasse als Referenz übergeben, erstellen Sie eine Kopie dieses gesamten Arrays. Das kann ziemlich viel Zeit auf einem "embedded" System (abhängig von Ihrer Definition von embedded). Natürlich, wenn Sie an Adresse übergeben, ist dies kein Problem.
Ihre # 2 ist ein kulturelles Thema. Wenn sie nicht bereit sind, neue Programmiertechniken auszuprobieren, werden Sie als Außenseiter angesehen. Das ist etwas, was du nicht passieren willst. Stellen Sie sie langsam vor.
Wenn man es nicht in das Repository legt - das ist Blödsinn. Jeder sollte alles in das Repository stellen, damit die Leute darauf zugreifen und später Fehler finden können.
Nicht um mein eigenes Horn zu tönen, aber ich habe vor ein paar Tagen eine ähnliche Frage gestellt: C ++ in einer eingebetteten Umgebung verwenden
Ich bin unsicher über 1. Vielleicht könnten Sie ein einfaches Codebeispiel zur Veranschaulichung geben.
Was 2 betrifft, stimme ich Ihnen zu. Als gehärteter C-Programmierer, der versucht, C ++ zu beschleunigen, bin ich total begeistert von der Idee, dünne Fassaden um bestehende C-APIs zu schreiben, um die Fehlerbehandlung und Ressourcenverwaltung zu vereinfachen.
Sie erstellen eine Kopie der Daten für Ihre Klasse, die Ihre Klasse nicht mehr als reine Wrapperklasse qualifiziert. Dies schützt Sie zwar davor, dass die Daten unter Ihnen gelöscht werden, aber wenn die ursprünglichen Daten geändert wurden, sind Ihre Daten veraltet.
Die Idee, das Array mit der Größe zu kapseln, ist vernünftig. Vielleicht können Sie sie dazu bringen, das Hinzufügen des Größenfeldes zu ihrem Container zu kaufen, vorausgesetzt, es ist nicht nur ein const int *. Aber ich kann sehen, dass für das bloße Privileg, die Größe zu kapseln, der Overhead von zusätzlichem Speicher und die Laufzeit, um die Klasse zu modellieren und zu initialisieren, für sie ungenießbar scheinen.
Darüber hinaus muss ich vollständig mit dem klassischen C-Bias sympathisieren, der darin besteht, dass C ++ böse und langsam ist. Flashbacks ... schaudern.