Na pewno nie we wszystkich, bo pamiętam że gdzieś widziałem przetłumaczone ;-J
A co do stylu... hmm.. to może ja też pokażę jak piszę ;-J
Ogólnie preferuję styl wielbłądzi gdzie się da, bo jest bardziej zwięzły niż z podkreślnikami [no i jak słusznie juz ktoś zauważył, podkreślniki wymagają więcej przyciśnięć klawiszy, a i tak trzeba nabijać shift ;-J]. Podkreślniki stosuję bardzo rzadko. Stosuję to dla wszystkich nazw, włącznie z nazwami stałych [nie lubię nazw pisanych w całości wielkimi literami, bo są nieczytelne].
Nazwy typów danych [struktur, klas, enumów, typedefów itp.] zaczynam od wielkiej litery, a konkretnych obiektów od małej. Robię tak dlatego, żeby dało się zrobić to, o czym ktoś tu wspomniał:
ObjectManager objectManager, czyli stosowanie tej samej nazwy dla typu i dla obiektu tego typu [to nie to samo, co
CNazwaKlasy, co uważam za nadmiarowe, bo już przecież sama składnia mówi gdzie jest nazwa typu, a gdzie nazwa obiektu]. Trochę to takie Javowe i zastanawiam się, czy odwrotnie nie byłoby bardziej logicznie ;-) W końcu nazwa własna obiektu to prawie jak imię, więc może powinno być z dużej ;-) w przeciwieństwie do pospolitej nazwy klasy, do której on należy ;-D [joke]
Nie używam i nienawidzę notacji węgierskiej. O ile w językach ze słabym typowaniem ma to jakiś sens, to w C++ już jest właściwie niepotrzebne. Od pamiętania typów mam kompilator i nie pozwalam mu się obijać ;-) a nazwy obiektów daję takie, żebym sam mógł się później domyślić "z kontekstu", jakiego są typu [jeśli się zastanawiam, znaczy złą nazwę wybrałem ;-J]. We własnym kodzie unikam też prefiksów, typu wxCośtam, glCośtam, SDL_cośtam, bo od tego są namespace'y ;-J Ilość tekstu do napisania jest w sumie taka sama, nie licząc operatora :: ;-P za to zyskuję na tym możliwość aliasowania tych przedrostków i włączania wybranych elementów z namespace'a.
Jeśli chodzi o klamerki, to jedynie przy blokach funkcji i klas mam zasadę, by umieszczać je obie w pierwszej kolumnie, w nowych liniach. Jednak w przypadku instrukcji warunkowych, switchy, pętli itp. raczej "zacieśniam" ;-) albo wogóle pomijam klamry tam, gdzie nie są potrzebne. Oczywiście robię wtedy wcięcia tak, żeby było wiadomo która instrukcja jest zależna od warunku. Wcięcia robię zazwyczaj na dwie.. góra trzy spacje, i na tyle mam ustawiony tab-stop. Używam też gdzieniegdzie spacji w nawiasach i wyrażeniach, jeśli mogą poprawić czytelność.
W klasach publiczny interfejs daję zawsze pierwszy, w całości, by nie trzeba było do niego przewijać kilka ekranów zbędnego tekstu prywatnej części klasy ;-J Składowych raczej nie poprzedzam żadnymi przedrostkami typu m_cośtam, tylko nadaję im jakieś sensowne nazwy. W akcesorach zazwyczaj nie daję get i set, tylko daję im takie same nazwy, a rozróżniam je po tym, że getCośtam() zawsze jest const, a setCośtam nigdy nie będzie const ;-J
Jeśli używam namespace'ów, to zazwyczaj najpierw deklaruję co jest w danym namespace'u, a dopiero później rozwijam definicję. Dzięki temu na początku nagłówka mam "skrót" tego, co siedzi w danej przestrzeni nazw i nie muszę zbytnio wcinać kodu tych definicji ;-J
Jeśli w klasie są jakieś krótkie funkcje [np. akcesory], które powinny być inline, piszę je w nagłówku na zewnątrz klasy, poprzedzając słówkiem inline. Staram się nie zaśmiecać definicji klasy, bo jej interfejs można traktować jako dokumentację, więc powinno to być jak najbardziej czytelne.
Ogólnie kieruję się paroma zasadami, a za każdą taką zasadą mam jakieś rationale, które uzasadnia jej stosowanie.
OK, to jeszcze mały snip jak to wygląda:
namespace Graphics {
class Sprite;
class SpookyGhost;
bool testCollision(const Sprite& a, const Sprite& b);
//...
}
class Graphics::SpookyGhost : public Graphics::Sprite
{
public:
int skladnik1;
bool visible() const; //Akcesor typu "Get". Zwraca true, gdy duszek widoczny.
void visible(bool newState); //Akcesor typu "Set". Ustawia nowy stan widocznosci.
void scarePlayer(const Player& player); //Jakas metoda.
//...
private:
bool visibility;
//...
};
inline bool Graphics::SpookyGhost::visible() const
{
return visibility;
}
//w pliku .cc :
void Graphics::SpookyGhost::scarePlayer(const Player& player)
{
if ( computeDistance(*this, player) < 10) {
visible( !visible() ); //pokaz sie
while (!player.scaredToDeath()) {
sayBoo();
makeNoise();
}
}
else setDirection( player.currentPosition() );
}
//gdzies w uzyciu... :
SpookyGhost spookyGhost, whiteGhost, greenGhost;//EDIT: Buu chyba jakiś autoformater tu jest, bo wcięło mi pojedyncze spacje przed "public" i "private". W ogóle to polskie znaki w kodzie [np. w komentarzach] zmieniało mi w referencje znakowe HTML, dlatego musiałem napisać je bez polskich liter. Szybka edycja też jest zrąbana - dodaje jakieś znaczki-dziwaczki w miejscu spacji.