Meine erste Klasse seit 15 Jahren. Mache ich das richtig?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
alf4712
Beiträge: 3
Registriert: Mo Apr 12, 2021 4:05 pm

Meine erste Klasse seit 15 Jahren. Mache ich das richtig?

Beitrag von alf4712 » Mo Apr 12, 2021 4:15 pm

Hallo zusammen,
ich hab vor 15 Jahren das letzte Mal mit C++ programmiert. Und ich hab festgestellt, da hat sich einiges geändert. Move-Operatoren, etc...
Da ich jetzt wieder anfange mit C++ zu programmieren möchte ich mir nicht irgendwelchen Blödsinn angewöhnen. Daher würde ich jetzt einfach mal meine erste Klasse kurz posten und euch bitten einfach mal ganz unverblümt mich auf jedes "Ungünstig" hinzuweisen, dass sich vielleicht bei mir eingeschlichen hat. Auch der Hinweis, was man den so generell beachten müsste beim Entwurf von Klassen. Ja, ich weiß es gibt viele Tutorials im Internet, aber denen mangelt es zu 99% bei den "warum"-Fragen. Die sagen, was technisch geht, aber sehr selten auch, warum man was machen oder lassen sollte.

Hintergrund: Ich möchte mit eine Musik-Programm schreiben, in der Art "Alleinunterhalter". Meine erste Klasse ist die Verwaltung, wecher Akkord momentan aktiv ist. Die Idee ist, jeden möglichen Ton in einem Array zu speichern. Also der Ton "c" ist Array[0], "cis" ist Array[1], etc. Da es 12 Töne gibt, hab ich mich für einen array[12] entschieden.
Bei "C-Dur" soll dann die Funktion "getAsString()" ein "c e g" schreiben. Also den Array durchgehen und alle Aktiven Töne mit Leerzeichen getrennt hinschreiben.
Wird natürlich alles später noch ausgebaut.

Mir geht es unter anderem um die "Best Practises", sowie übliche Namenconventionen und "typische Arbeitsweisen".
Mein Endprogramm soll in c++/winrt geschrieben sein, da ich das XAML-Prinzip super finde und ich glaube, dort eine gute Performence zu haben.

Code: Alles auswählen

// .h
#pragma once
#include <array>

class alfMusicChord
{
private:
	std::array<bool, 12> notes;

public:
	alfMusicChord() noexcept;
	alfMusicChord(const alfMusicChord& chord) noexcept;
	alfMusicChord(alfMusicChord&& chord) noexcept;
	alfMusicChord(winrt::hstring const& value) noexcept;

	alfMusicChord& operator=(const alfMusicChord& chord) noexcept;
	alfMusicChord& operator=(alfMusicChord&& chord) noexcept;
	alfMusicChord& operator=(winrt::hstring const& value) noexcept;

	void parseString(winrt::hstring const& value) noexcept;
	winrt::hstring getAsString();
};

Code: Alles auswählen

// .cpp
#include "alfMusicChord.h"

alfMusicChord::alfMusicChord() noexcept
	:notes({ false,false,false,false, false,false,false,false, false,false,false,false })
{
}

alfMusicChord::alfMusicChord(const alfMusicChord& chord) noexcept
	:notes(chord.notes)
{
}

alfMusicChord::alfMusicChord(alfMusicChord&& chord) noexcept
	:notes(std::move(chord.notes))
{
}

alfMusicChord::alfMusicChord(winrt::hstring const& value) noexcept
	:notes({ false,false,false,false, false,false,false,false, false,false,false,false })
{
	parseString(value);
}

alfMusicChord& alfMusicChord::operator=(const alfMusicChord& chord) noexcept
{
	notes = chord.notes;
	return *this;
}

alfMusicChord& alfMusicChord::operator=(alfMusicChord&& chord) noexcept
{
	notes = std::move(chord.notes);
	return *this;
}

alfMusicChord& alfMusicChord::operator=(winrt::hstring const& value) noexcept
{
	parseString(value);
	return *this;
}

void alfMusicChord::parseString(winrt::hstring const& /*value*/) noexcept
{
	// TODO
}

winrt::hstring alfMusicChord::getAsString()
{
	return winrt::hstring(L"ToDo"); // TODO
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Meine erste Klasse seit 15 Jahren. Mache ich das richtig?

Beitrag von Xin » Mo Apr 12, 2021 4:52 pm

alf4712 hat geschrieben:
Mo Apr 12, 2021 4:15 pm
ich hab vor 15 Jahren das letzte Mal mit C++ programmiert. Und ich hab festgestellt, da hat sich einiges geändert. Move-Operatoren, etc...
Joah, vor 15 Jahren war C++03 noch aktuell, da hat sich einiges getan.
alf4712 hat geschrieben:
Mo Apr 12, 2021 4:15 pm
Da ich jetzt wieder anfange mit C++ zu programmieren möchte ich mir nicht irgendwelchen Blödsinn angewöhnen. Daher würde ich jetzt einfach mal meine erste Klasse kurz posten und euch bitten einfach mal ganz unverblümt mich auf jedes "Ungünstig" hinzuweisen, dass sich vielleicht bei mir eingeschlichen hat. Auch der Hinweis, was man den so generell beachten müsste beim Entwurf von Klassen. Ja, ich weiß es gibt viele Tutorials im Internet, aber denen mangelt es zu 99% bei den "warum"-Fragen. Die sagen, was technisch geht, aber sehr selten auch, warum man was machen oder lassen sollte.
Ich sag mal so... von dem, was ich jetzt da sehe, ist das sauberer als das, was ich schreibe. Ich schreibe jedenfalls kein noexcep dahinter. :-D
Und das ist definitiv keine Kritik daran, dass Du das tust - im Gegenteil!

Aber eine einzelne Klassen macht jetzt nicht den großen Sprung in C++. Hier wäre mir override wichtig, aber dafür bräuchte man ja schon zwei Klassen. :-D

In der Anwendungs kann es wichtiger werden auf "new" zu verzichten und sich make_shared anzusehen.
alf4712 hat geschrieben:
Mo Apr 12, 2021 4:15 pm
Mir geht es unter anderem um die "Best Practises", sowie übliche Namenconventionen und "typische Arbeitsweisen".
Da gibt es so viele Meinungen zu, dass sogar ich mehrere habe.

Typen schreibe ich beispielsweise immer groß. Außer sie sind primitiv. Die Unterscheidung trifft C++ aber nicht. Also sind Typen, die ich klein schreibe, in meinem Verständnis primitiv. Und da habe ich in dem Sinne auch kein eindeutiges Verständnis für. :-|

Ich sehe, dass Du Dir move angesehen hast - was sehr gut ist. Aber in einem Typen, das ausschließlich aus einem Bool-Array besteht keinen Unterschied macht. Du kopierst auch beim Moven alle Bools. Move macht dann Sinn, wenn Pointer verwendet werden. Wird hier aber nicht.

Ansonsten ist Dir die Verwendung von const offensichtlich ein Begriff. Ich würde es noch gutheißen, sich auf East-Const (int const) oder West-Const (const int) zu einigen. Ich rate zu East-Const und widerspreche damit der Mehrheit. Ich gehöre aber zu der Mehrheit, die schöner findet, wenn es einheitlich gemacht wird, statt abwechselnd. :-D

Du wirst immer wieder Dinge dazulernen und feststellen, dass Du den Code überarbeiten möchtest. Ich würde auch nicht direkt auf sämtliche modernen Techniken aufspringen. std::variant halte ich für eine Modeerscheinung, weil es Dinge vereinfacht, die vielleicht gar nicht vereinfacht werden sollten.

Ich programmiere beruflich ein etwas altbackenes C++ und bin damit weniger modern als viele meiner Kollegen. Dafür habe ich aber auch wenig Fehler im Fehlertracker. Trotzdem rate ich dazu, sich Modern C++ anzusehen und damit zu spielen, um ein Feeling zu bekommen. Gerade die Algorithmen oder for( bool : this->notes ) oder sowas sind schon ein Blick wert. Ich sage also definitiv nicht, dass man sich modernen C++ in irgendeiner Form verweigern sollte.
Nur soweit mit Verstand rangehen, dass ein neues Feature nicht bedeutet, dass man Ältere damit zu ersetzen hätte.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

alf4712
Beiträge: 3
Registriert: Mo Apr 12, 2021 4:05 pm

Re: Meine erste Klasse seit 15 Jahren. Mache ich das richtig?

Beitrag von alf4712 » Di Apr 13, 2021 11:04 am

Danke schön für diese Ausführungen. Ich werde mich mal in die entsprechenden Themen etwas mehr einlesen.

Antworten