Wie Komplexere Projekte korrekt Programmieren

Foochan schrieb:
Ob ich dann eine In-Memory oder irgend eine andere Art von Datenbank bekomme, sehe ich an meiner Klasse nicht. Zur Laufzeit interessiert mich das womöglich auch nicht. Vorteil: Ich bin nicht von einer konkreten Datenbank abhängig. Wohin mein Service die Daten schreibt, spielt für den Service keine Rolle.

Dazu muss die Datenbank über Interfaces aber auch stark abstrahiert sein, wenn das tatsächlich so gehen soll. Man würde im Service vielleicht eher DAOs injecten, die intern dann konkrete Abhängigkeiten auf eine Datenbank haben, oder nicht? Aber selbst dann: wenn das übergreifend zwischen SQL und NoSQL gehen soll, ist das imho eher schwierig. Manche DBs unterstützten beispielsweise Transaktionen, manche nicht; des Weiteren sind die Query-Sprachen bei nahezu jeder NoSQL-DB anders... bei relationalen DBs hat man idR. einfach nur SQL oder zumindest sowas wie Criteria.
 
Zuletzt bearbeitet:
Dependency Injection und Vererbung sind doch keine Konzepte die gegeneinander arbeiten. Dependency Injections dienen eben zur erzeugen von Kompositionen(grob gesagt^^) und Vererbung ist eben Vererbung. Also einmal Ist-Teil-von und einmal Ist-ein.

Man sollte auch immer bedenken das ein guter Programmierer Java Programmierer der sich aber nicht so gut in C++ auskennt zu ganz anderen Lösungen kommt wie ein guter C++ Programmierer und umgekehrt das gleiche. Viele Dinge die ich in C++ schreibe würde ich niemals so in Java umsetzen und umgekehrt.(arbeite beruflich sowohl mit Java als auch C++)

Achja, wie man lernt guten Code zu schreiben? Das lesen der Bücher ist natürlich hilfreich, das lesen von Code anderer auch, am wirklich lernen wird man es vor allem dadurch das man selber Dinge ausprobiert und prüft ob diese wohl praxistauglich sind. Man bekommt dann mit der Zeit immer mehr ein Gefühl dafür was möglich ist und was sinnvoll.
 
crvn075 schrieb:
Dazu muss die Datenbank über Interfaces aber auch stark abstrahiert sein

Ich muss gestehen, dass "Datenbank" im Allgemeinen ein schlechtes Beispiel ist. Was ich in der Praxis im Spring-Umfeld gesehen habe, ist die Verwendung von "Repositories". So hat man beispielsweise das Interface "CustomerRepository" mit Methoden wie "save", "delete", "findById", "findByName", etc. Dann gab es zwei Implementierungen. Eine, die mit einer Oracle-DB kommuniziert hat und eine, die die Daten In-Memory gespeichert hat. Die Implementierung/Design-Entscheidung möcht ich an dieser Stelle nicht bewerten. Sonst wird das ganze noch mehr OT :-)
 
Fonce schrieb:
Achja, wie man lernt guten Code zu schreiben? Das lesen der Bücher ist natürlich hilfreich, das lesen von Code anderer auch, am wirklich lernen wird man es vor allem dadurch das man selber Dinge ausprobiert und prüft ob diese wohl praxistauglich sind.
Cpp core guideline checker nutzen und such an den core guidelines orientieren, ggf. GSL einbinden
 
@new Account()
Ja, die GSL sind bei C++ ein Hilfsmittel, aber auch sie alleine führen nicht automatisch zu gutem Code. Ich kann GSL konformen Code schreiben der trotzdem scheiße ist...
 
@new Account() hattest du sehr starke Langeweile und bist über diesen Thread gestolpert oder suchst du spezifisch nach 2 1/2 Jahre alten Threads? Nur mal so aus Interesse.
 
ich hatte den Thread mal gelesen, und hatte gedacht, das wäre sinnvoll das evtl. zu erwähnen im Zusammenhang von C++.

andy_m4 schrieb:
Am besten C++, wann immer möglich, vermeiden. :-)
Ich halte es eher so:
Wann immer C++ sinnvoll ist, C++ einsetzen und dabei die Schwächen von C++ vermeiden.

@Fonce stimmt, da die guide lines sich eher auf die Verwendung der Sprache konzentrieren und nicht auf die Architektur.
 
Zuletzt bearbeitet:
new Account() schrieb:
Wann immer C++ sinnvoll ist, C++ einsetzen und dabei die Schwächen von C++ vermeiden.

Derartiges gleitet zwar schnell in Subjektivität ab, aber dennoch würde ich darauf gern ein wenig kritisch darauf eingehen:

Schwächen hat C++ (vom heutigen Standpunkt aus gesehen) eine Menge, denn wir entfernen uns immer weiter von der Hardware und arbeiten an immer abstrakteren Konzepten & Software.
D.h. "die Schwächen von C++ vermeiden" wird zunehmend schwieriger und unproduktiver.

Nicht zuletzt natürlich auch deshalb, weil
(a) neuere Sprachen wie Swift, Rust, ... sich schnell verbreiten und aktiv versuchen Kritikpunkte von älteren Sprachen zu beseitigen,
(b) sich immer mehr Software ins Web & die Cloud verlagert
und
(c) selbst Sprachen mit "super-high-level" Abstraktion - also sehr einfache Sprachen wie etwa Python - mehr und mehr zur Alternative werden -> wer will sich schließlich noch C++ ans Bein binden, wenn Performance nicht mehr das ausschlaggebende Kriterium ist, weil GPGPU immer populärer für rechenintensive tasks wird und vor allem, weil es mit NumPy & Co. mittlerweile sehr viele libs gibt, die rechenintensives in C und Fortran auslagern, aber bequem von Python aus steuerbar sind.

Ich habe anfangs auch noch in C++ rumgedödelt und z.B. mit OpenCV und C++ angefangen, mich in Computer Vision zu stürzen sowie mit Eigen Statistikzeug o.Ä. gemacht.

Mittlerweile habe ich seit bestimmt 4 Jahren C++ gar nicht mehr angefasst. Alles ist nur noch Web oder Python. Gelegentlich für Externe mal Java. Selten dann Mal Rust für irgendwas spezifisches.

Auch C nutze ich nur noch für einen einzigen Zweck: um für einen konkreten Anwendungsfall eine Funktion zu schreiben, die ich per API aus Python ansteuern kann (wenn einem im Profiling eben auffällt, das für eine bestimmte Funktion noch keine andere lib unter Python vorhanden ist und es einem in nativem Python zu viel Performance frisst).


Für low-level Zeug wird es natürlich noch länger bleiben, aber allgemein sind die Tage von C/C++ wohl gezählt. Sieht man ja auch an Stackoverflow, GitHub und Co. Neues Zeug wächst massiv (nicht nur, aber unter anderem Python) und C/C++ sinkt in der Verbreitung.
 
ascer schrieb:
Derartiges gleitet zwar schnell in Subjektivität ab, aber dennoch würde ich darauf gern ein wenig kritisch darauf eingehen:
Hier kann man für jedes Projekt eine Nutzen/Kostenrechnung machen -> objektiv.

ascer schrieb:
Schwächen hat C++ (vom heutigen Standpunkt aus gesehen) eine Menge, denn wir entfernen uns immer weiter von der Hardware und arbeiten an immer abstrakteren Konzepten & Software.
D.h. "die Schwächen von C++ vermeiden" wird zunehmend schwieriger und unproduktiver.
Also bist du der Meinung, dass Abstraktion eine Schwäche von C++ ist? Kannst du das genauer erläutern?

Wachstum von Sprachen 2016->2017: https://stackoverflow.blog/2017/09/06/incredible-growth-python/
… 2018: https://www.tiobe.com/tiobe-index/
C und Java sind nach einen Einbruch wieder sehr stark gewachsen. VB steigt auch relativ stark an...

Was denkst du, ist der Grund, warum Python so stark wächst?
Weil die Sprache so gut geeignet ist um kommerzielle Anwendungen zu erstellen?
Was sind die großen Stärken?
Ich vermute ganz stark den KI Hype.


Warum denkst du, dass C++ im Vergleich sinkt?
Ich denke genau deswegen:
ascer schrieb:
Mittlerweile habe ich seit bestimmt 4 Jahren C++ gar nicht mehr angefasst. Alles ist nur noch Web oder Python.
Web ist nichts, das mit C++ viel am Hut hat, daher...

C++ einsetzen wo es sinnvoll ist. Sicher nicht um WebApps zu erstellen (-> TypeScript & Co) oder wissenschaftliche Applikationen zu erstellen / KI Libraries (TensorFlow, CNTK(C++), …) ausprobieren (->Python) oder Windows Applikationen zu erstellen (->C# oder TypeScript & Co), ...
 
new Account() schrieb:
Also bist du der Meinung, dass Abstraktion eine Schwäche von C++ ist? Kannst du das genauer erläutern?

Kurzgefasst, weil C++ den Spagat zwischen OOP, Abstraktion, ... und der Hardwarenähe von C macht.

Wie du ja richtig geschrieben hast:
new Account() schrieb:
C und Java sind nach einen Einbruch wieder sehr stark gewachsen.

Das liegt - zumindest zum Teil - daran, dass anfängt einzelne, rechenintensive Tasks mit C zu implementieren (wofür das im Prinzip ja auch gedacht war und seine Stärken ausspielen kann), eine ganze Software aber in höheren, einfacheren, leichter wartbaren Sprachen zu entwickeln.


new Account() schrieb:
Web ist nichts, das mit C++ viel am Hut hat

Das ist richtig, der entscheidende Punkt dabei ist aber imho das Rust, C#, Java usw. viele Anwendungsszenarien von C++ "geklaut" haben, indem man dort "einfacher" für den jeweiligen Zweck Anwendungen implementiert...und viele Anwendungen mittlerweile eben von klassischer Implementation ins Web / in die Cloud verfrachtet werden.

Textverarbeitung z.B. war früher häufig in C, dann C++ geschrieben. Heute sind große Teile z.B. bei Microsoft natürlich mit C# implementiert...aber mit der rasant steigenden Verwendung und Verbreitung von den Cloud-Angeboten (z.B. office.com) wird es ins Web / in die Cloud verlagert.

Also historisch betrachtet hat es schon einen gewaltigen Umbruch von C/C++ (und Vorgängern/Konkurrenten) zu moderneren Sprachen gegeben und mittlerweile verlagern sich viele Anwendungsfälle weiter ins Web / die Cloud.


new Account() schrieb:
Was denkst du, ist der Grund, warum Python so stark wächst?
Weil die Sprache so gut geeignet ist um kommerzielle Anwendungen zu erstellen?
Was sind die großen Stärken?
Ich vermute ganz stark den KI Hype.

Das hat imho mehr Gründe. Abgesehen von Cloud- und Web-Dev mit Python sowie einigen anderen Dingen, hast du aber sicherlich nicht ganz unrecht: Knowledge Management wird für jedes Unternehmen immer wichtiger und nicht nur im Bereich KI, sondern generell bei fast allen Disziplinen im Bereich Data Science ist Python mittlerweile führend.


new Account() schrieb:
C++ einsetzen wo es sinnvoll ist. Sicher nicht um WebApps zu erstellen (-> TypeScript & Co) oder wissenschaftliche Applikationen zu erstellen / KI Libraries (TensorFlow, CNTK(C++), …) ausprobieren (->Python) oder Windows Applikationen zu erstellen (->C# oder TypeScript & Co), ...

Du siehst aber, die Liste wurde - in der Historie betrachtet - immer kürzer. Unter Linux z.B. gibt es eine wachsende Community, die für kleine Komponenten wieder vermehrt C einsetzen möchte und für größere Dinge dann modernere Sachen, wie etwa Rust.

Apple hat sich auch schon abgespalten. Microsoft schon lange. Stück für Stück brechen da Felder weg, die einstig C++-Domänen waren.


EDIT:
new Account() schrieb:
Hier kann man für jedes Projekt eine Nutzen/Kostenrechnung machen -> objektiv.

Fast vergessen: das ist der einzige Punkt, wo ich wirklich widersprechen würde. Egal ob nun im Unternehmen oder im OpenSource-Bereich, der größte Teil der Programmierer ist nicht gerade sehr fähig und ich habe sehr häufig beobachtet, dass (a) eher die dem entscheidenden Dev/Leiter bekannten Sprachen - ohne andere objektive Bewertung - bevorzugt werden und (b) moderne Neuentwicklung kritisch beäugt werden, weil ja andere Sachen bereits in Betrieb sind.

Nicht immer natürlich, aber relativ häufig würde ich also an der Objektivität der entscheidenden Stellen durchaus Zweifeln. Gerade in Deutschland, da hier Neues ja üblicherweise viel später Einzug hält, als etwa im Silicon Valley.
 
Zuletzt bearbeitet:
ascer schrieb:
Kurzgefasst, weil C++ den Spagat zwischen OOP, Abstraktion, ... und der Hardwarenähe von C macht.
Kannst du das weiter ausführen?
V.a., wenn du Spagat als Kompromiss siehst, denn dieser ist wohl höchstens in der STL vorhanden, welche sich auf zero-cost Abstraktionen beschränkt. Es steht einem natürlich frei Kosten auf sich zu nehmen und Objektorientierung frei zu leben:
 
new Account() schrieb:
Also bist du der Meinung, dass Abstraktion eine Schwäche von C++ ist? Kannst du das genauer erläutern?
Na die Abstraktion als solche nicht. Sondern eher deren Beschränkungen die dadurch entstehen, dass man in C++ nur Abstraktionen aufnimmt, die Zero-cost sind: Sprich keine signifikanten Laufzeitnachteile bringt.
Das bedeutet zwar, dass Du "bedenkenlos" alles aus C++ benutzen kannst ohne befürchten zu müssen, dass das Dir irgendwie die Performance in den Abgrund reißt.
Das heißt aber auch, dass Dir bestimmte Abstraktionen verwehrt bleiben.
Man denke nur an die Objektorientierung von C++. Die ist im Vergleich zu Smalltalk fürchterlich. Eben auch weil das Designziel war möglichst keine Laufzeitverluste zu haben.

Man kann dies sowohl als Vorteil als auch als Nachteil sehen. Kommt halt darauf an, was man macht.

Es gibt aber auch Sachen, da gibt es nicht viel zu diskutieren. Sowas wie die Notwendigkeit eines Präprozessors. Oder ein fehlendes Modulkonzept. Die relativ langsame Geschwindigkeit der C++ Compiler (teilweise bedingt durch fehlendes Modulkonzept; teilweise bedingt, dass C++ halt ziemlich schwer zu kompilieren ist).

new Account() schrieb:
Was sind die großen Stärken?
Ich vermute ganz stark den KI Hype.
Python war auch schon beliebt vor dem KI-Hype. Das liegt ganz einfach daran, dass Python relativ einfach zugänglich ist. Es ist einfach zu erlernen. Vor allem im Vergleich zu C++.
Dadurch wird Python nicht automatisch zur Lösung schlechthin. Aber für Einiges ist es halt eine gute Lösung.

new Account() schrieb:
C++ einsetzen wo es sinnvoll ist. Sicher nicht um WebApps zu erstellen (-> TypeScript & Co) oder wissenschaftliche Applikationen zu erstellen / KI Libraries (TensorFlow, CNTK(C++), …) ausprobieren (->Python) oder Windows Applikationen zu erstellen (->C# oder TypeScript & Co), ...
Ja. Da bleibt nicht allzuviel übrig. :-)
Wie ich schon sagte: C++ nur dann, wenn es unumgänglich ist.
 
new Account() schrieb:
Kannst du das weiter ausführen?

Da war @andy_m4 schneller :D


Grundsätzlich läuft es darauf hinaus:
new Account() schrieb:
C++ einsetzen wo es sinnvoll ist. Sicher nicht um WebApps zu erstellen (-> TypeScript & Co) oder wissenschaftliche Applikationen zu erstellen / KI Libraries (TensorFlow, CNTK(C++), …) ausprobieren (->Python) oder Windows Applikationen zu erstellen (->C# oder TypeScript & Co), ...

Diese Liste wird immer länger, sodass immer weniger für C++ übrigbleibt. Windows und Mac haben C++ schon den Rücken gekehrt, Linux fängt auch immer mehr damit an.
 
Die fehlende Abstraktion zeigt sich ja schon bei relativ einfachen Dingen.

Zum Beispiel bei Datentypen. Also generell ist es ja nicht verkehrt, dass man Variablen deklarieren und ihren einen Datentyp zuweisen kann.
Die Datentypen selbst sind aber bei C++ eher auf die Hardware ausgerichtet. Bei Zahlen gehts halt um Bitbreiten. Das macht in Bezug auf Hardware (oder wenn ich Hardware-nahe Sachen mache) Sinn. Vor allem aber stellt es sicher, das die Sachen schnell berechnet werden.

Das Problem was es zu lösen gilt ist aber normalerweise nicht an irgendwelche Bitbreitengrenzen gebunden. Wenn ich also zwei Zahlen addiere, will ich halt das die addiert werden. Ohne das ich Probleme mit irgendwelchen Überläufen bekomme. Bei C++ muss ich mir dazu Gedanken machen. Andere Sprachen abstrahieren das weg.
Und bei praktischen Anwendungen nützen mir die Bitbreiten auch wenig. Wenn ich jetzt ne Variable monat habe, nützt mir ja nur begrenzt etwas, wenn ich die als int (or whatever) deklariere.
Was ich eigentlich möchte ist die als Ganzzahl >=0 und <=12 deklarieren können.

Klar kann man solche Sachen in C++ implementieren. Keine Frage. Nur muss man es dann halt auch selbst machen. Und das Problem wenn Abstraktionen nicht standardisiert sind, dass dann jeder sein eigenes Süppchen kocht. Was es dann wiederum schwieriger macht fremden Code zu lesen.

So zieht halt Eines das Andere nach sich.
 
andy_m4 schrieb:
Wie ich schon sagte: C++ nur dann, wenn es unumgänglich ist.
C++ wenn es sinnvoll ist, halte ich immer noch besser als C++ stur versuchen zu vermeiden.
andy_m4 schrieb:
Klar kann man solche Sachen in C++ implementieren. Keine Frage. Nur muss man es dann halt auch selbst machen.
Oder boost benutzen, was in gewisser Weise einen Standard darstellt - aber natürlich nicht auf Sprachebene.
 
@andy_m4
Also das Beispiel mit dem Monat ist naja, seltsam...
Bei welcher Sprache kannst du den ein Integer ohne einen Gewissen Aufwand darauf eingrenzen? Entweder ich schreibe mir dann einfach eine eigene Klasse "Month", was eine Sache von 5min ist oder das Standard Framework bzw. eine externe Bibliothek liefert was passendes(was bedeutet jemand anderes hat die Arbeit erledigt).

Ich mag C++, aber trotzdem hab ich bei einem unserer Projekte den Großteil des Codes von C++ nach C# portiert und das aus mehreren Gründen. Zum einen, weil die benötigte Bibliotheken, z.B. fürs Logging, besser für unseren Einsatzzweck geeignet sind und große Teile der Architektur sich mit weniger Aufwand optimieren ließen.
Features oder Performance von Sprachen zu vergleichen kann interessant sein, aber in der Praxis wird man dann in der Regel weitere Aspekte betrachten müssen.
 
new Account() schrieb:
C++ wenn es sinnvoll ist, halte ich immer noch besser als C++ stur versuchen zu vermeiden.

Zumindest meinerseits - bei @andy_m4 hab ich aber auch nichts Gegenteiliges rausgelesen - waren das nur Feststellungen und partiell Kritik. Eine Sprache, oder überhaupt irgendwas, stur zu vermeiden würde mir nicht in den Sinn kommen.

Abgesehen von der restlichen Kritik meinte ich primär eben, dass die Sprache in die Tage gekommen ist und vieles, was man früher in C++ gelöst hat, nun keine C++-Domänen mehr sind. (Man denke eben an Apple & Microsoft oder mittlerweile sogar Linux)

Man stellt halt auf modernere Sachen (Swift, Rust, C# unter Windows ...) um, lagert ins Web aus oder nimmt für Server-, Data-Science-, XYZ-Anwendungsfälle eben einfache Sprachen* mit spezialisierten Libraries (unter anderem z.B. Python).

C++ ist heutzutage, im Vergleich zu den modernen Sachen, eben "wieder" der Versuch C um neue Paradigmen zu erweitern.

Deshalb, imho, steigt ja auch wieder die Verbreitung von C. Für wirklich performance-kritische Sachen will man den ganzen "Overhead" von C++ nicht immer haben und man möchte heutzutage eben auch nur noch bedingt große Projekte nativ in C++ umsetzen. Sicherlich kommen noch andere Gründe dazu, aber ich denke deshalb setzt man verstärkt auf moderne Sprachen und lagert performance-kritische Sachen per library in möglichst einzelne C-Funktionen aus -> dafür ist C super und wenn man nur einfache, einzelne Funktionen schreibt auch gut wartbar.

* einfach im Hinblick auf Abstraktionsniveau um Fehler zu reduzieren, Entwicklungszeiten zu verkürzen, Re-Usability zu erhöhen, Wartbarkeit zu vereinfachen usw.
 
Zuletzt bearbeitet:
new Account() schrieb:
als C++ stur versuchen zu vermeiden.
Naja. Was heißt stur vermeiden. Ich muss auch sagen, dass ich selten in die Verlegenheit kommt, wo C++ die optimale Wahl wäre. :-)
Das mag bei jemand anderen ja auch wieder anders aussehen. Ich kann da nur für mich sprechen.
Und wie es schon gesagt wurde. Für viele Sachen sind auch andere Sprachen "gut genug" oder es sind neue Sprachen erschienen, die die C++-only-Bereiche kleiner gemacht haben.

Fonce schrieb:
Bei welcher Sprache kannst du den ein Integer ohne einen Gewissen Aufwand darauf eingrenzen?
Zum Beispiel in Racket. Wobei es da zwei verschiedene Wege gibt. Einmal via Contracts. Das sind verbindliche Eigenschaften für Werte und auch ein sehr allgemeiner Mechanismus.
Passender ist eigentlich Typisierung zu benutzen und dann über Type-Refinements Einschränkungen zu machen.

So kann ich z.B. eine Variable monat als positive Ganzzahl definieren:
(define monat : Positive-Integer 2)

Und Positive-Integer lassen sich mit Refinements noch weiter einschränken:
(define monat : (Refine [n : Positive-Integer] (< n 12)) 2)

Und weil ich ja nicht jedes Mal alles schreiben will, bloß weil ich ein Monatswert deklariere, kann ich den neu erschaffenen Typ natürlich definieren:
(define-type Month-type (Refine [n : Positive-Integer] (<= n 12)))

Nu lässt sich ganz einfach schreiben:
(define monat : Month-type 2)

Fonce schrieb:
Entweder ich schreibe mir dann einfach eine eigene Klasse "Month"
Über Klasse ginge auch. Aber ich verwende nicht immer OOP und dann ist das doch etwas Fremdkörpergefühl.

Fonce schrieb:
Ich mag C++, aber trotzdem
Ja. Man braucht vermutlich auch ne gewisse emotionale Bindung. Ist so wie bei einer Mutter, die ihr eigenes Kind immer am hübschesten findet. :-)
 
Zurück
Oben