ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4442149
Jetzt (Chat):
15 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Sourcecode-Probleme
Stil
GepinntSeite: 1 2 >
AutorThema
@uzingLG Offline
ZFX'ler


Registriert seit:
01.07.2003

Österreich
StilNach oben.
Tach,
ich hab wieder mal ein Stilproblem. Und zwar: was für Präfixes soll ich für die Variablen verwenden? Mir bekannte Möglichkeiten:
--> Ungarische Notation
--> Schreiben wie intMeinInteger
--> Kein Präfix ausser für Pointer und Globale Varieblen usw
Und wie bei Funktionen? Und wie bei Funktionen aus Klassen?
THX im Voraus!
20.07.2004, 17:06:33 Uhr
Pyramid-Network
Specialist Offline
ZFX'ler


Registriert seit:
29.08.2003

Nordrhein-Westfalen
99606527
Re: StilNach oben.
Mach es doch irgendwie, hauptsache du behältst eine Methode bei und wechselst nicht, sonst gibbet ein unüberschaubares Durcheinander...
Ich benutze z.B. keine Notation, weil meine Projekte nicht so riesig groß sind, dass ich sie nicht mehr überblicken könnte.
20.07.2004, 17:57:13 Uhr
BugSoft
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: StilNach oben.
Versuchs mit möglichst kurzen Präfixen, schliesslich soll man die genutzten Variablen noch als solche erkennen können. Dazu möchte ich dir Namespaces ans Herz legen. Wenn du dazu noch einfache Präfixe für spezifische Daten wie int, float etc. verwendest, solltest du auf der sicheren Seite liegen.
Code:
// Subsystem Blafix, Projekt Bla
namespace bla {
  namespace Blafix {
    class blaTestSuite
    {
    private:
       int   m_iNo;
       float m_fCoor[3];
...
    };
  } // Ende Namespace Blafix
} // Ende Namespace Bla

Vorteil der Schreibweise:
Präfix m_f zeigt dir, dass es sich um ein Attribut vom Datentyp float handelt etc. . Man kann aufgrund der Variablen noch auf die gespeicherten Daten zurückschliessen (nicht zu unterschätzender Vorteil, erhöht die Lesbarkeit ungemein). Und durch den Einsatz der Namespaces kannst du das zugehörige Subsystem erkennen.

MfG Kimmi
20.07.2004, 18:22:59 Uhr
Kurzer Weblog
Zyrian Offline
ZFX'ler


Registriert seit:
22.12.2002

Nordrhein-Westfalen
225791969
Re: StilNach oben.
Präfixe wie m_blabla sind imho total unnötig. das prinzip der OOP fußt auch auf die kapselung der daten und wenn man tatsächlich mal öffentliche attribute hat, dann muss man diese sowieso über den punkt bzw. -> Operator ansprechen.
und da man seine klassen generell übersichtlich halten soll, spricht es imho eher für einen designfehler, wenn man später net mehr die attribute von fremdvariablen unterscheiden kann.

was noch dösig ist, sind Cs als klassenpräfixe (Bsp: CSprite). schlechter stil...

bei der ungarischen notation sollte man auch net übertreiben. ein i für int und ein f für float ist in ordnung. aber sobalds dann losgeht mit lpstrName und so zeugs, das trägt keinesfalls zu einem gut lesbaren code bei.

1 Mal gendert, zuletzt am 20.07.2004, 19:17:44 Uhr von Zyrian.
20.07.2004, 19:16:08 Uhr
Florianx Offline
ZFX'ler


Registriert seit:
27.02.2002

Bayern
Re: StilNach oben.
Das einzige Präfix, dass ich nutze, ist m_, da ich es hasse, wenn ich eine längere Funktion durchlese und nicht mehr weiß ob die Variable jetzt nur local ist oder nicht.
20.07.2004, 19:24:11 Uhr
Cygon Offline
Programmier-Berater


Registriert seit:
18.08.2002

Hessen
4389513
Re: StilNach oben.
Diese Präfix/Postfix-Geschichten wurden ursprünglich für dynamisch typisierte Sprachen eingeführt, um hier die Kontrolle über Variablen zu behalten (z.B. wenn ein Ausdruck grundsätzlich als wahr/falsch ausgewertet werden soll).

Man kann sich natürlich trotzdem drüber streiten, ob das in Sprachen mit statischen Typsystem wie C++ nicht auch Sinn mach, meiner Meinung nach ist es aber überflüssig.

Ich habe früher mit ungarischer Notation gearbeitet und mit sind nach deren Abschaffung keine Probleme oder Unklarheiten aufgefallen. Vor allem das C vor Klassennamen möcht' ich nie wieder haben - wenn man die Klasse direkt nach dem benennt, was sie sein soll (z.B. ParticleEmitter oder Texture), dann kann man viel intuitiver sagen, was zu der Klasse gehört und was fehl am Platze ist. Das kurze C vor dem Namen irritiert unser Gehirn tatsächlich mehr als es scheint

Ansonsten schliesse ich mich Specialist an. Seine Codierungstechniken weiterzuentwickeln ist ok, aber in einem Projekt zig Notationen zu führen macht den Code nicht unbedingt schöner...

-Markus-


1 Mal gendert, zuletzt am 20.07.2004, 19:52:24 Uhr von Cygon.
20.07.2004, 19:48:52 Uhr
LunaticSystems
@uzingLG Offline
ZFX'ler


Registriert seit:
01.07.2003

Österreich
Re: StilNach oben.
thx
Noch eine Frage hätte ich aber.
Was ist der bessere/sauberere Stil?
Vector *vec = new Vector (10, 20, 30);
oder
Vector vec = Vector (10, 20, 30);

1 Mal gendert, zuletzt am 20.07.2004, 20:48:46 Uhr von @uzingLG.
20.07.2004, 20:48:11 Uhr
Pyramid-Network
Cygon Offline
Programmier-Berater


Registriert seit:
18.08.2002

Hessen
4389513
Re: StilNach oben.
Hängt natürlich vom Verwendungszweck ab. Meine Ansichten sind:

Wenn du den Vector nur innerhalb der Funktion benötigst, würde ich unter allen Umständen
Vector vec = Vector (10, 20, 30);
bevorzugen. Das ist schneller, der Heap wird nicht mit Mikro-Objekten zugemüllt und du musst dich im Falle einer Exception nicht um das Aufräumen kümmern. Weiterhin sind new/delete bei kleinen Dingen wie der xyz-Vector-Klasse eigentlich nur selten sinnvoll, da man kaum etwas dadurch gewinnt (im Gegenteil, langsamer und mühsamer in der Verwendung).

Wenn es nicht klar ist, wann Objekte erstellt werden (z.B. bei Singletons), wenn man Objekte wiederverwenden möchte (Pooling) oder wenn das Objekt später durch ein anderes ersetzt werden soll, sowie bei grösseren Speichermengen (z.B. 1000 Vectors für ein Partikelsystem), dann sind Pointer eher sinnvoll.

-Markus-
20.07.2004, 21:27:30 Uhr
LunaticSystems
Specialist Offline
ZFX'ler


Registriert seit:
29.08.2003

Nordrhein-Westfalen
99606527
Re: StilNach oben.
Wird wohl ganz darauf ankommen, wie du "vec" nutzen möchtest. Wenn feststeht, dass "vec" immer nur einen Vector enthalten soll und nicht ein Array o.ä. dann dürfte die dynamische Speicherallozierung überflüssig sein.

1 Mal gendert, zuletzt am 20.07.2004, 21:31:39 Uhr von Specialist.
20.07.2004, 21:31:19 Uhr
BugSoft
@uzingLG Offline
ZFX'ler


Registriert seit:
01.07.2003

Österreich
Re: StilNach oben.
THX.
Und noch eine Frage (ich glaube es ist die letzte):
Wenn ich einen Haufen Variablen habe, die ich alle hintereinander Deklariere, soll ich dann alle auf gleicher Höhe haben? (also mit einem Haufen Leerzeichen nach kurzen Typen) Und sollen die =s (*g*) auf gleicher Höhe stehen, wenn ich einige Variablen nacheinander verändere?
20.07.2004, 21:40:28 Uhr
Pyramid-Network
Cygon Offline
Programmier-Berater


Registriert seit:
18.08.2002

Hessen
4389513
Re: StilNach oben.
Wenn mehrere Variablen deklariert werden, ist es wahrscheinlich übersichtlicher, wenigstens die Variablennamen auf dieselbe Spalte auszurichten. Ob man die Initialisierungswerte, mit oder ohne Gleichheitszeichen, dann auch noch ausrichtet, ist wohl wirklich nurnoch Geschmackssache

Ideal ist es natürlich, garnicht erst soviele Variablen zu haben, dass man sie ausrichten muss. In C++ ist es sogar eine gute Übung, Variablen erst in dem Gültigkeitsbereich zu deklarieren, in dem sie erforderlich werden. So kann man sich vor allem sinnlose Konstruktoraufrufe bei Objekten sparen, die möglicherweise nur unter bestimmten Umständen nötig sind.

-Markus-
20.07.2004, 22:33:45 Uhr
LunaticSystems
Zyrian Offline
ZFX'ler


Registriert seit:
22.12.2002

Nordrhein-Westfalen
225791969
Re: StilNach oben.
naja, gibt sicher aba mal ein paar stellen wo man mehrere variablen deklarieren muss.
bestes beispiel sind die attribute einer klasse
20.07.2004, 22:47:59 Uhr
Tactive Offline
ZFX'ler


Registriert seit:
21.07.2004

Niedersachsen
Re: StilNach oben.
Hmm, Klassennamen ohne C davor ??
Und wie behält man dann den Überblick was für einen Zustand ein Objekt hat, also bei einem Interface z.b. ??

Also so z.b.
Code:
class IFoo
{
public:
  virtual int GetHealth(void) ABSTRACT;
  virtual int GetArmor(void) ABSTRACT;
  virtual void Destroy(void) ABSTRACT;
};

class CFoo : public IFoo
{
protected:
  int GetHealth(void);
  int GetArmor(void);
  void Destroy(void);
};


-
Tactive

p.s.: Sowas brauche ich ständig für meine lbraries.

2 Mal gendert, zuletzt am 21.07.2004, 18:57:56 Uhr von Tactive.
21.07.2004, 18:56:26 Uhr
Cygon Offline
Programmier-Berater


Registriert seit:
18.08.2002

Hessen
4389513
Re: StilNach oben.
Wie schon mehrmals betont, so eng, dass man das eine als falsch und das andere als richtig bezeichnet würde ich die Sache mit der Notation garnicht sehen. Ich habe bei meinen Projekten aber keine Notwendigkeit mehr für diese Präfixe gesehen (es sind durchaus auch grössere dabei, inklusive Plugin-Architektur, siehe z.B. www.nuclex.org) und sie deshalb abgeschafft - und bin eigentlich recht glücklich darüber

Zum Beispiel bei CFoo/IFoo könnte man kritisieren, dass CFoo garnicht klar aussagt, wie es zu IFoo steht. Handelt es sich um die Default-Implementation ? Handelt es sich um einen Helfer, um nicht zuviele Interna der Implementationsklasse zu veröffentlichen ? Ist es vielleicht nur für den DLL-Export gedacht ? Wenn einem die Notation am Ende noch das Ausdenken von aussagekräftigen Namen abnimmt verfällt man leicht dazu, dann wirklich nicht mehr nach den treffenden Bezeichnungen zu suchen. Bei mir würde es jedenfalls ein Image und ein DefaultImage für die Default-Implementation geben, oder ein VideoDevice und ein Direct3DVideoDevice.

Als Kritikpunkt könnte man wahrscheinlich sehen, dass der Benutzer jetzt nicht sofort mitbekommt, ob er new VideoDevice schreiben darf oder nicht (während es bei new IVideoDevice klar wäre). Ich finde aber, dass man den Code wesentlich intuitiver auffassen kann, wenn man nicht erst im Geiste die Präfixe ausblenden muss.

-Markus-
21.07.2004, 19:58:12 Uhr
LunaticSystems
Friso Offline
ZFX'ler


Registriert seit:
05.12.2003

Hessen
Re: StilNach oben.
Moin Moin,

Bei Präfixe für Klassennamen überwiegen meiner Meinung eher die Vorteile. Daher nenne ich jetzt mal nur Vorteile:
- Man erkennt sofort, wenn Klassennamen verwendet werden.
- Beim Anlegen von Instanzen, muss man sich keine großen Gedanken über die Namensgebung machen. Man läßt einfach das Präfix weg.
- Ein fixes Grep liefert alle Verwendungen des Klassennamens. Und nicht MEHR, weil es auch in anderen Namespaces so benannt werden kann, Oder ein umgangssprachliches Wort ist.
- Man kann am Präfix gleich die übergeordnete Bibliothek/Modul erkennen. Die Verwendung von Namespaces ist noch länger.
21.07.2004, 20:51:33 Uhr
LordHoto Offline
ZFX'ler


Registriert seit:
22.09.2002

Hessen
349986626
Re: StilNach oben.
wie ich sehe benutzen viele m_*** für Member.
Also ich finde persönlich _*** füt Member schöner.

MFG

LordHoto
21.07.2004, 21:30:15 Uhr
Cygon Offline
Programmier-Berater


Registriert seit:
18.08.2002

Hessen
4389513
Re: StilNach oben.
Wenn ich das mal kritisieren darf:

- Man erkennt sofort, wenn Klassennamen verwendet werden.
Erkenne ich am Kontext im Code, daran, dass es sich um ein Hauptwort handelt und am beginnenden Großbuchstaben (Funktionen und Methoden beginnen bei mir mit Kleinbuchstaben).

- Beim Anlegen von Instanzen, muss man sich keine großen Gedanken über die Namensgebung machen. Man läßt einfach das Präfix weg.
Genau das meine ich mit dem Bequemlichkeitsproblem. Der so gewonne Variablenname sagt etwa soviel aus, als wenn ich eine float-Variable mit dem namen "Float" anlegen würde

- Ein fixes Grep liefert alle Verwendungen des Klassennamens. Und nicht MEHR, weil es auch in anderen Namespaces so benannt werden kann, Oder ein umgangssprachliches Wort ist.
Da wäre ich trotzdem vorsichtig. Um im ganzen Projekt irgendwelche Bezeichner umzubenennen gibt es gute Refactoring-Tools, die das 100% sicher und korrekt erledigen

- Man kann am Präfix gleich die übergeordnete Bibliothek/Modul erkennen. Die Verwendung von Namespaces ist noch länger
Hat jetzt nichts mehr mit der C/I-Frage zu tun. Ein Präfix ist aber zwang, während man einen namespace auch importieren kann und das Umbenennen hier noch wesentlich leichter fällt.

@LordHoto: Wäre auch eine Alternative, allerdings sollte man dann logischerweise die Members nicht mit Grossbuchstaben beginnen lassen, um Konflikte mit Symbolen vom Compiler und seiner Runtime library zu vermeiden

-Markus-
21.07.2004, 21:40:33 Uhr
LunaticSystems
Tactive Offline
ZFX'ler


Registriert seit:
21.07.2004

Niedersachsen
Re: StilNach oben.
Habe heute mal etwas bewusster auf meinen Quelltext geschaut und festgestellt das ich schon ziemlich abstruse Namenskonstrukte einführe bzw. verwende.

Ein String-Array in einer Klasse von mir war z.b. so deklariert:

Code:
class CFoo
{
private:
  CStringArray   m_rgsINISectionNames;
};


Nach ein wenig Nachdenken und dessen was hier gesagt wurde, muss ich zugestehen das mir das wohl alles an Informationen bietet damit ich weiss um was für einen Typ es sich bei der Variabel handelt, aber ich muss auch gewaltige Kopfarbeit leisten um auf die Variablen-Bezeichnung zu kommen bzw. wieder in der Klassendeklaration danach suchen und das obwohl ich eigendlich weiss was ich will/brauche.

Der Aufwand der ungarischen Notation überwiegt also streng genommen dem Nutzen des ganzen.

Ein Zeiger auf dieses Konstrukt würde das nochmals verdeutlichen:

Code:
CStringArray* prgsINISectionNames = &m_rgsINISectionNames;


Das ist wahrlich auf den ersten Blick nicht mehr so offensichtlich was da behandelt wird, schon gar nicht 1-2 Monate später nachdem es geschrieben wurde.

Ich neige jedenfalls mittlerweile dazu die ungarische Notation mittlerweile aus meinem Kopf zu streichen, weil die Kopf- und Tipparbeit dadurch doch reduziert wird


-
Tactive


3 Mal gendert, zuletzt am 22.07.2004, 12:30:01 Uhr von Tactive.
22.07.2004, 12:27:08 Uhr
Tales Offline
ZFX'ler


Registriert seit:
23.01.2003

Niedersachsen
105838607
Re: StilNach oben.
Ungarische Notation spart sogar Platz..

z.b.

bLeftMouseDown // bool, Ob
vLeftMouseDown // vector, Wo
tLeftMouseDown // zeit, Wann

Aber man sollte nicht übertreiben, m_strSectionNames (an "Names" erkennt man die Mehrheit) hätte für meinen geschmack schon gereicht. Der rest lässt sich vom Kontext auslesen.

sehr gute Erfahrungen hab ich mit dem hier gemacht:

b = bool
i = int
c = char
str = string
p = pointer, aber dann kein anderes flag dahinter
C = Klasse
m_ = Member

1 Mal gendert, zuletzt am 22.07.2004, 12:43:17 Uhr von Tales.
22.07.2004, 12:41:56 Uhr
Tactive Offline
ZFX'ler


Registriert seit:
21.07.2004

Niedersachsen
Re: StilNach oben.
Das 'v' assoziere ich z.B. erstmal mit dem Typ void. Und ob die Maus gedrück wurde könnte man auch so handeln:

Code:
class CFoo
{
public:
  bool isLeftMouseDown(void) const
  {
    return leftMouseDown;
  }
  
private:
  bool leftMouseDown;
};


Im zweiten Step könnte ich das ganze jetzt noch Thread-Sicher machen. Aber man muss auch nicht alle in Objekte / Funktionen umwandeln

-
Tactive

22.07.2004, 12:51:49 Uhr
Mastermind Offline
Knowledge-Admin


Registriert seit:
18.10.2002

Nordrhein-Westfalen
Re: StilNach oben.
Ich wusste gar nicht das void ein Typ ist.
22.07.2004, 12:58:16 Uhr
Work in Progress
Swordfighter Offline
Administrator


Registriert seit:
25.02.2002

England
Re: StilNach oben.
Zitat von Mastermind:
Ich wusste gar nicht das void ein Typ ist.
man lernt nie aus
22.07.2004, 13:58:48 Uhr
Swordfighter's Realm
Tales Offline
ZFX'ler


Registriert seit:
23.01.2003

Niedersachsen
105838607
Re: StilNach oben.
es wird auch so behandelt um genau zu sein, für diesen LeftMouseDown part sieht es genau so aus..

Code:
class CWnd
{
private:
m_bLeftMouseDown // bool, Ob
m_vLeftMouseDown // vector, Wo
m_tLeftMouseDown // zeit, Wann

public:
  bool IsLeftMouseDown()
  {
    return m_bLeftMouseDown;
  }
};


Ich habe bisher noch keinen voidpointer gehalten, deswegen bevorzuge ich v für vektoren.

Bzw ich denke darüber nach vielleicht eine Operation "Is(int param)" umzusetzen, um den Aufruf so zu gestalten:

Is(CWnd::LeftMouseDown) .. das finde ich logischer, ob besser ist eine andere Frage.
22.07.2004, 14:12:25 Uhr
Patrick Offline
ZFX'ler


Registriert seit:
25.02.2002

Deutschland
143040199
Re: StilNach oben.
Zitat von Mastermind:
Ich wusste gar nicht das void ein Typ ist.


Niemals soetwas benutzt bzw. gemacht?

Code:
bool foobar (const void *data)
{
    // Mach was
}

bzw.:

class Foo
{
public:
   // ...

private:
   void *data;
};

Spätestens da fällt es doch einem auf.
22.07.2004, 15:49:35 Uhr
GermanGameDev
Cygon Offline
Programmier-Berater


Registriert seit:
18.08.2002

Hessen
4389513
Re: StilNach oben.
Die Herren in der Pedantenloge spielen sicher nur darauf an, dass void nur Platzhalter für nichts oder unbekannt ist und keinen Datentyp darstellt wie int oder float

-Markus-
22.07.2004, 16:51:42 Uhr
LunaticSystems
GepinntSeite: 1 2 >


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel