Funktionsname: Enable/Disable

#6090627
Lesenswert?

Arduino Fanboy D. schrieb:
> Du kannst das C++ vielleicht riechen.
> Ich sehe es hier noch nicht.

Du meinst, es wäre C? Das steht da ebenso nicht.

>
>
> Aber wo du die OOP schon ins Spiel bringst:
> https://de.wikipedia.org/wiki/Zugriffsfunktion
> Da ist es absolut üblich setxxx() und getxxx() zu verwenden.
> oder auch mal isxxx()

Liest das nochmal ganz genau. Da stehen solche Sätze wie:

/In anderen Programmiersprachen ist dies unüblich und die Methode hieße 
einfach name, da bereits der Funktionsaufruf als solcher ein Holen in 
sich hat./
#6090648
Lesenswert?

Arduino Fanboy D. schrieb:
> Walter T. schrieb:
>> Funktion
>
> Wilhelm M. schrieb:
>> Methode
>
> !?!

Ich habe nirgendwo von Methode geschrieben. Das kommt nur im Zitat vor. 
Desweiteren ist Methode und Elementfunktion ja synonym. Du scheinst es 
wirklich nicht zu verstehen, was der Unterschied ist. Const-Correctness 
ist etwas ganz wichtiges. Nur Java kann das eben nicht, deswegen diese 
bekloppten Namen, deren Semantik der Compiler ja nicht überprüft.
Gast #6090650
Lesenswert?

So eine Frage macht nur im Gesamtkontext Sinn. Kannst Du mit XXX noch 
etwas anderes machen? Parametrieren, Diagnose, Abfragen, ... . Wenn es 
beispielsweise nur an/aus gemacht werden kann (und sonst nichts), dann 
reicht auch XXX(bool on). Erst wenn es andere Aktionen gibt bemisst sich 
der Name (und seine Geschwätzigkeit) daran, das alles gut und eindeutig 
unterscheiden zu können.

StatusLed(bool on) reicht völlig aus, wenn es nichts anderes dazu gibt.
Gast #6090667
Lesenswert?

naja ein Schalter nennt man switch,
schaltet man etwas physisches ist on/off okay,
(fernseher an)
schaltet man nur teile ab (fernseher an, ton aus)
ist enable/disable die korektere bezeichnung.

ich würde also
1
void XXX_enable(bool on)
2
{...}
3
//und noch n overload dazupacken
4
void XXX_enable()
5
{
6
   XXX_enable(true);
7
}
8
//sowie ein disable, weil man ja bequem ist
9
void XXX_disable()
10
{
11
   XXX_enable(false);
12
}
du kannst aber auch ohne overload
den Namen anders gestalten zB
1
void XXX_switch(bool enable)
2
{...}
3
//und dann trotzdem mit enable
4
void XXX_enable()
5
{
6
   XXX_switch(true);
7
}
8
//und disable arbeiten wenn du magst
9
void XXX_disable()
10
{
11
   XXX_switch(false);
12
}

eine funktion enableDisable zu nennen halte ich für falsch,
das verwirrt nur, weil man die "Richtung" des Aufrufparameters nichtmehr 
so schnell erkennt (schaltet true nun ein oder aus?)

Im Grunde aber kannst Du die Funktion auch "Reinhold" nennen wenn Du das 
nur ordentlich dokumentierst (ist nicht schön, aber es regnet auch keine 
Fische falls Du es doch tust)
OP #6090676
Lesenswert?

In diesem Fall gibt es tatsächlich nur vier Funktionen:
1
    void DRV0_init();
2
    void DRV0_deinit();
3
    void DRV0_enable();
4
    void DRV0_disable();

Es hat den Programmfluß deutlich übersichtlicher gestaltet, die beiden 
letzten Funktionen zu einer zusammenzufassen. Nur der gute Name fehlt 
noch.

Walter K. schrieb:
> Wenn Du bei jedem function-name in Foren nachfragst, dann wird das wohl
> ein längerdauerndes Projekt ;-)

Ich habe am Jahresendfreitag viel Zeit. Da kann man auch mal über 
nicht-dringende Sachen sinnieren.
Gast #6090679
Lesenswert?

> XXX_enable(true);
Hier ist die Semantik klar, irgendein Flag wird auf true gesetzt.

> XXX_enable(false);
Hier lese ich, dass das Flag nicht angefasst wird.
Es könnte auch meinen, dass das Flag auf false gesetzt wird.

setXxxFlag(true);
setXxxFlag(false)
getXxxFlag();
lassen keine Zweifel aufkommen
Gast #6090721
Lesenswert?

Arduino Fanboy D. schrieb:
> Hier lese ich, dass das Flag nicht angefasst wird.

Eine Funktion aufrufen die Absichtlich genau nichts tut?
Haste das schonmal gemacht? Ich in 30 Jahren nicht

Arduino Fanboy D. schrieb:
> Hier ist die Semantik klar, irgendein Flag wird auf true gesetzt.

Woher weisst Du, daß Walter überhaupt ein flag setzen will?
ich seh nirgendwo eins, ich seh auch nicht wo eins abgefragt werden 
würde...
hätte ja auch ein toggle pin sein können um ne LED anzuknipsen.
(völlig ohne flags)

Aber ja, klar setzt er ein flag wäre "set" eine logische 
Funktionsnamensergänzung.
und wollte er es nachher irgendwann abfragen ist "get" ebenso hilfreich.
Aber ernsthafterweise bei -wie wir nun wissen- nur vier funktionen,
können die auch Dieter, Klaus, Bärbel und Renate heissen ohne wirklich 
verwirrung zu stiften ;)

Walter T. schrieb:
> void DRV0_deinit();
Walter, deinit?
nene das wort gibt's nicht
uninitialize gäb's wenn es nur um die Rückgängigmachung der 
initialisierung geht. (quasi reset, no init)
ansonsten sind terminate oder destroy (zur einleitung des Abbruchs) 
vermutlich die konstruktnamen die Du suchst.
Moderator #6090805
Lesenswert?

Arduino Fanboy D. schrieb:
>> XXX_enable(true);
> Hier ist die Semantik klar, irgendein Flag wird auf true gesetzt.

"Enable" steht für freigeben, aktivieren oder einschalten und ist meist
mehr als nur das Setzen eine Variable auf true oder false. Um bspw. die
automatische Belichtungseinstellung einer externen Kamera zu aktivieren,
muss eine entsprechenden Nachricht an die Kamera geschickt werden.

Selbst wenn eine Aktivierung einer bestimmten Funktionalität tatsächlich
durch eine boolesche Variable erfolgt (die dann von einem anderen
Programmteil gepollt wird), handelt es sich bei dieser Variable um ein
Implementierungsdetail, das für den Aufrufer der Enable-Funktion nicht
von Interesse ist.

>> XXX_enable(false);
> Hier lese ich, dass das Flag nicht angefasst wird.
> Es könnte auch meinen, dass das Flag auf false gesetzt wird.

Man kann sich natürlich alle Mühe geben, das falsch zu verstehen. Das
kann ich auch bei deinem Vorschlag:

> setXxxFlag(true);

Hier wird das Flag gesetzt und damit die Funktionalität aktiviert.

> setXxxFlag(false)

Hier lese ich, dass das das Flag nicht gesetzt (aber auch nicht
gelöscht) und die Funktionalität in ihrem gegenwärtigen Zustand
(aktiviert oder deaktiviert) belassen wird.

Um das Flag zu löschen und damit die Funktionalität zu deaktivieren,
bräuchte man eine weitere Funktion namens clearXxxFlag().


Ich würde die aktuelle Namensgebung einfach beibehalten:

Walter T. schrieb:
>     void DRV0_enable();
>     void DRV0_disable();

weil das für mich am klarsten ausdrückt, was jeweils getan wird.

> Es hat den Programmfluß deutlich übersichtlicher gestaltet, die beiden
> letzten Funktionen zu einer zusammenzufassen

Inwiefern hat das einen Einfluss auf den Programmfluss?
Gast #6090906
Lesenswert?

Ach, die nervigen Flag-Parameter... Letztendlich sind sie mehr schlecht 
als recht:

    https://martinfowler.com/bliki/FlagArgument.html


Und wenn man (oft) gezwungen ist, irgendwo zu schreiben:
1
    if (some_condition)
2
    {
3
        enableXYZ();
4
    }
5
    else
6
    {
7
        disableXYZ();
8
    }

...sollte man gleich weiter machen: Warum muss man überhaupt mit einer 
IF-Abfrage unterscheiden, ob irgendetwas freigegeben werden soll oder 
nicht? Kann man das nicht schon viel früher wissen und dieses IF 
entsorgen?


Alternativ kann man auch das nichtssagende True/False in etwas 
sinnvolles umbenennen:

    https://www.codereadability.com/boolean-arguments/



Man könnte sich noch an einem anderem Thema abarbeiten: Warum überhaupt 
die Namen "enable/disable" verwenden? Man liest es zwar millionenfach, 
doch sind diese beiden Begriffe viel zu generisch:

  - Eine LED kann hell oder dunkel sein.
  - Ein Motor kann gestoppt sein oder sich drehen, womöglich ich zwei 
Richtungen.
  - Eine Datenübertragung kann gestartet und gestoppt werden.

etc.


Übrigens, sid schrieb:
1
> void XXX_enable(bool on)
2
> {...}
3
> //und noch n overload dazupacken
4
> void XXX_enable()
5
> {
6
>    XXX_enable(true);
7
> }
8
> //sowie ein disable, weil man ja bequem ist
9
> void XXX_disable()
10
> {
11
>    XXX_enable(false);
12
> }

...ist ziemlich übel, auch wenn es in so vielen (C++)-Büchern drin 
steht: Nun gibt es für das "Enable" und "Disable" plötzlich jeweils zwei 
Möglichkeiten, die (hoffentlich) jeweils das selbe tun:
1
    // Freigabe
2
    XXX_enable();
3
    XXX_enable(true);
4

5
    // Sperre
6
    XXX_disable();
7
    XXX_enable(false),

Gar nicht gut! Wie soll sich der Programmierer entscheiden? Welche der 
beiden Methoden ist jeweils die bessere und sollte bevorzugt werden? Und 
warum? Usw.
Gast #6090934
Lesenswert?

Experte schrieb:
> Gar nicht gut! Wie soll sich der Programmierer entscheiden? Welche der
> beiden Methoden ist jeweils die bessere und sollte bevorzugt werden? Und
> warum? Usw.
Du bist mir ja n Experte ... tse

Naja wie Du siehst tun sie dasselbe (exakt dasselbe ohne chance es nicht 
zu tun)
zu bevorzugen ist klar xxx_switch(bool) (ein call weniger)
ist aber manchmal unbequem..
während der initialisierung zB
ist xxx_enable(); shöner als xxx_switch(true); zu tippen,
weil man beim lesen des codeblocks nicht über funktion nachzudenken 
braucht um ihn zu ergründen.
idealerweise weiss man unzweifelhaft ahaaa drv0 wird hier aktiviert

Experte schrieb:
> Ach, vergessen: Persönlich würde ich statt:
>     XXX_enable();
>
> immer:
>     enableXXX();  // oder auch enable_XXX();
>
> vorziehen. Das ist halbwegs normal lesbares Englisch.

Absolut NICHT

hat man DRV0 DRV1 DRV2 usw zu beackern
ist DRV0_enable()
in der funktionsübersicht zusammen mit DRV0_read() und 
DRV0_gehmirnichtaufdenSack()
danach folgen dann DRV1 und DRV2
benutzt man enableDRV0() enableDRV1() und enableDRV2()
gruppiert sich das eben genauso in der Funktionsübersicht,
gefolgt von gehmirnichtaufdenSack_DRV0() gehmirnichtaufdenSack_DRV1() 
gehmirnichtaufdenSack_DRV2()
und man kann sich schneller 'verklicken' ;)

Ausserdem behält das so höhere Konsistenz
sollte man sich später zu Objektklassen
hangeln
DRV0.enable()
ist näher an DRV0_enable() als an enableDRV0() ;)

wieso ich as anspreche?
naja DRV-NULL bedeutet für mich dass sich jmd die option für eins zwei 
und drei offenhalten möchte.

ab drei find ich macht ne Objektklasse deutlich Sinn..
oder was sagt der selbsternannte Experte dazu?
#6091004
Lesenswert?

Walter T. schrieb:
> void DRV0_init();
>     void DRV0_deinit();
>     void DRV0_enable();
>     void DRV0_disable();




Hab mir jetzt nicht wirklich alles durchgelesen, aber wieso gibt es eine 
Methode Enable mit einem Parameter bool und eine Methode Disable mit 
einem Parameter bool?

Wenn man Enable(true) aufruft, dann ist enabled und wenn man das gleiche 
mit fale aufruft, dann ist disabled. Sonst braucht man doch keinen 
Parameter?

Wenn das Ganze am Ende über eine Instanzvariable aufgerufen wird, dann 
kann man sich doch unnötiges BlaBla im Namen sparen?

MyDrv.Enable(true); oder wie auch immer.

Analog zur Elektronik, habe ich doch an einem Bustreiber oder so auch 
nur einen Eingang /en.
#6091010
Lesenswert?

Yalu X. schrieb:
> Ich würde die aktuelle Namensgebung einfach beibehalten:
>
> Walter T. schrieb:
>>     void DRV0_enable();
>>     void DRV0_disable();
>
> weil das für mich am klarsten ausdrückt, was jeweils getan wird.

Das macht den Aufruf aber komplizierter, wenn es laufzeitabhängig 
eingesetzt werden soll.

if( bedingung) DRV0_enable();
else DRV0_disable();

statt

setDRV0_enable(bedingung);
Gast #6091065
Lesenswert?

Sven L. schrieb:
> aber wieso gibt es eine Methode Enable mit einem Parameter bool und eine
> Methode Disable mit einem Parameter bool?

Nein, gibt es nicht.

Walter T. schrieb:
> Es hat den Programmfluß deutlich übersichtlicher gestaltet, die beiden
> letzten Funktionen zu einer zusammenzufassen. Nur der gute Name fehlt
> noch.

Vorher 2 ohne Parameter
Jetzt 1 mit bool
#6091073
Lesenswert?

A. S. schrieb:
> Sven L. schrieb:
>> aber wieso gibt es eine Methode Enable mit einem Parameter bool und eine
>> Methode Disable mit einem Parameter bool?
>
> Nein, gibt es nicht.
>
> Walter T. schrieb:
>> Es hat den Programmfluß deutlich übersichtlicher gestaltet, die beiden
>> letzten Funktionen zu einer zusammenzufassen. Nur der gute Name fehlt
>> noch.
>
> Vorher 2 ohne Parameter
> Jetzt 1 mit bool

Falls es die Sprache hergibt, kann man das noch durch einen Defaultwert 
"true" für den Parameter vereinfachen, denn der steckt ja implizit im 
Namen drin.
Gast #6091090
Lesenswert?

Getter und setter ermöglichen, auf Zugriffe zu reagieren. Das kann auch 
hilfreich sein, bei künftigen Änderungen kompatibel zu bleiben. Manche 
Leute verbieten direkte Zugriffe auf Objekt-daten regelrecht.

Auf meiner Arbeit sind getter und setter Pflicht. Immer und überall, 
ihne wenn und aber.
#6091094
Lesenswert?

Implementierung:
1
class Person
2
{
3
    private string _name;  // the name field
4
    public string Name    // the Name property
5
    {
6
        get => _name;
7
        set => _name = value;
8
    }
9
}

Auftruf:
1
Person person = new Person();
2
person.Name = "Joe";  // the set accessor is invoked here                
3

4
System.Console.Write(person.Name);  // the get accessor is invoked here

https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/using-properties
Beitrag #6091100 wurde von einem Moderator gelöscht.
#6091101
Lesenswert?

Stefan ⛄ F. schrieb:
> Getter und setter ermöglichen, auf Zugriffe zu reagieren. Das kann auch
> hilfreich sein, bei künftigen Änderungen kompatibel zu bleiben. Manche
> Leute verbieten direkte Zugriffe auf Objekt-daten regelrecht.
>
> Auf meiner Arbeit sind getter und setter Pflicht. Immer und überall,
> ihne wenn und aber.

Einen ordentlichen Compiler ist das auch egal. Der kann aus
1
 Objekt.setVariable(42)
problemlos
1
mov DWord Ptr [esi],42
machen.
(Adresse von Objekt in esi vorausgesetzt, aber die bräuchte er ja für 
einen Call auch)
Gast #6092046
Lesenswert?

Carl D. schrieb:
>> Auf meiner Arbeit sind getter und setter Pflicht. Immer und überall,
>> ihne wenn und aber.
>
> Einen ordentlichen Compiler ist das auch egal.

Getter und Setter sind hier ja nicht wirklich Thema. Aber abgesehen von 
Teams mit blutigen Anfängern ist ein Zwang dazu schon bedenklich. 
Spätestens, wenn für jede Variable auch gleich getter und setter 
angelegt werden, wird es absurd.
#6092091
Lesenswert?

Stefan ⛄ F. schrieb:
> Manche
> Leute verbieten direkte Zugriffe auf Objekt-daten regelrecht.

Wenn sie non-const sind und zum internen Zustand der Objekte beitragen, 
ist das ja eines der wesentlichen Prinzipien der OOP. Insofern 
selbstverständlich.

>
> Auf meiner Arbeit sind getter und setter Pflicht. Immer und überall,
> ihne wenn und aber.

Wie meinst Du das? Etwa für jedes non-const Member Modifikatoren und 
Observatoren-Elementfunkitonen? Falls dem so ist, solltest Du mal mit 
dem Verantwortlichen ein ernstes Gespräch führen.
Gast #6092147
Lesenswert?

Wilhelm M. schrieb:
> War das jetzt ein implizites "ja" zu meiner Frage?

Es war ein implizites ja zu:
> Etwa für jedes non-const Member Modifikatoren und
> Observatoren-Elementfunkitonen?

Und ein "will ich nicht tun" zu:

> solltest Du mal mit dem Verantwortlichen ein ernstes Gespräch führen.
Gast #6092178
Lesenswert?

Stefan ⛄ F. schrieb:
> Und ein "will ich nicht tun" zu

Da machst nix dran.
Der Wilhelm hat es halt voll auf dem Schirm.
Da können wir beide nicht gegen an stinken.

Er hat es sich auf seinem hohen Ross schön bequem gemacht.
Dieser hohe Grad an Schlauheit und Wissen gibt ihm das Recht, alle 
anderen nach Belieben für blöd zu erklären.

Hier erwischt es gerade uns beide.


Ansonsten entert er sowieso jeden nur möglichen Thread, und prahlt mit 
seinem C++. Egal ob das zum Thema passt oder nicht.

Zusammenfassung:
Wilhelm hat immer recht.
Missverständnisse und Kommunikationsprobleme gibt es in seiner Welt 
nicht.
Und wenn, hat er nichts damit zu tun, es sind immer nur die anderen, 
welche zu blöd sind, zu kapieren was er meint.
Gast #6093155
Lesenswert?

Stefan ⛄ F. schrieb:
> Auf meiner Arbeit sind getter und setter Pflicht. Immer und überall,
> ihne wenn und aber.

Typisches "Prinzip Hoffnung":

Stelle eine einfache Regel auf, beschäftige Programmierer mit dem 
Schreiben von Boilerplate-Code, und hoffe auf ein gutes Ergebnis.

Genau das Gegenteil passiert aber.
Gast #6093715
Lesenswert?

Stefan ⛄ F. schrieb:
> Das ist ja auch nicht meine Regel, ich muss sie nur umsetzen.

Stefan, Du bist so erfahren und hast so viel hier und auf Deiner 
Webseite veröffentlicht. Und dann propagierst Du eine kuriose Regel, die 
Du blind befolgst und hast Dir noch keine Gedanken dazu gemacht? 
Nichtmal auf Nachfrage?
#6098523
Lesenswert?

A. S. schrieb:
> Carl D. schrieb:
>>> Auf meiner Arbeit sind getter und setter Pflicht. Immer und überall,
>>> ihne wenn und aber.
>>
>> Einen ordentlichen Compiler ist das auch egal.
>
> Getter und Setter sind hier ja nicht wirklich Thema. Aber abgesehen von
> Teams mit blutigen Anfängern ist ein Zwang dazu schon bedenklich.
> Spätestens, wenn für jede Variable auch gleich getter und setter
> angelegt werden, wird es absurd.

Auch zitieren will gelernt sein ;-)
Hint: spitze Klammer zählen.
#6098592
Lesenswert?

A. S. schrieb:
> Und dann propagierst Du eine kuriose Regel, die
> Du blind befolgst und hast Dir noch keine Gedanken dazu gemacht?

Es gibt Dinge, an denen rüttelt man nicht. Schon garnicht, wenn das Team 
groß genug ist, Tiefflieger enthält (denn wegen denen macht man solche 
Regeln) und der Code dann auch noch ziemlich alt und unter Zeitdruck 
entwickelt ist.

100k LoC C++98 ohne STL konvertierst du auch nicht "mal eben so". Vor 
allem nicht, wenn zuwenig Leute dran arbeiten, die Entwicklung 
weitergehen soll, die Mitarbeiter nicht auf C++17 mit STL und den vielen 
Design-Patterns geschult sind und Verifikation teuer und langwierig ist.

Im Übrigen gibt es einen Unterschied zwischen "ich finde die Regel gut" 
und "naja, manche wollen eben auch solchen Unsinn".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren