Konwencje – czysty kod

Czym są konwencje, jeśli chodzi o języki programowania? Są to pewne zbiory zasad dotyczące zapisu kodu tj. jego układu, ilości wcięć w tekście, formy zapisu nazw zmiennych czy obiektów, metod/funkcji itd.

Przyjęte konwencje są typowe dla konkretnego języka, często zależna jest po prostu od składni danego języka. Oznacza to, że kod dla danego języka przybiera pewien typowy dla niego „wygląd” oraz jest przejrzysty, mówi się, że jest to kod „czysty”. W tym artykule postaram się wskazać na przykładzie kilku języków kiedy trzymanie się tych zasad zaciemnia kod, a kiedy jest na odwrót oraz jak  w danych językach odbiera je potencjalny pracodawca.

Jakie języki?

Do omówienia tego tematu wybrałem kilka znanych języków:

  • Java,
  • C++,
  • C#,
  • JavaScript,
  • Python.

Wszystkie z wymienionych języków są używane w mniejszym lub większym stopniu, są również odległe od siebie co do przeznaczenia, co nie zmienia faktu, że często wzajemnie się przenikają.

Pomimo tych różnic, każdy z tych języków ma przyjęta przez twórców(lub społeczność) konwencję co do tego jak powinien wyglądać kod. W przypadkach niektórych z nich interpreter odmówi wykonania kodu jeśli jej nie zachowamy, z kolei dla niektórych nie ma to większego znaczenia.

Java

Java to język stary. Powstał w 1995 roku dzięki inicjatywie Jamesa Goslinga. Następnie język był rozwijany przez firmę Sun Microsystems, która to  została wykupiona przez Oracle. Java jest rozwijana po dziś dzień przez tą ostatnią firmę, służy do budowy aplikacji mobilnych, webowych oraz czasami desktopowych.

Jeśli chodzi o przyjętą przez Sun a później Oracle konwencję to jest ona szeroko znana jednak nie zawsze się jej przestrzega szczególnie w środowiskach większych zespołów developerskich.

Zasady typowe dla tej konwencji:

  • nazwy klas wyglądają następująco: ClassName,
  • nazwy metod: methodName,
  • zmienne lokalne: variableName,
  • zmienne globalne: GLOBALVARIABLE(tzew. constant; zmienne niestatyczne powinny być zapisane z użyciem camelCase),
  • nazwy interface’ów powinny być przymiotnikiem, najlepiej kończącym się na -able o ile to możliwe,
  • łamanie nazw metod przy ich referowaniu/definiowaniu i wyrównywanie do lewej(na wysokości któregoś ze słów kluczowych),
  • nazwy plików: source – .java; binarny – .class,
  • układ klamer jak następuje:

    statement{
    }
  • zmienne zazwyczaj powinny być deklarowane/definiowane, referowane jedna pod drugą, nigdy zaś w sposób liniowy.

Logo Java

C++

C++ to język starszy od Javy, powstał w 1983 roku dzięki Bjarne Stroustrup. Był w pewnym sensie następcą języka C, gdzie dawał możliwość programiście „niemartwienia się” o użytkowanie pamięci oraz dawał możliwość programowania obiektowego, C doczekał się obiektówki dużo, dużo później przy stworzeniu języka Objective-C oraz dalej, po pewnych modyfikacjach poprzez dodawanie bibliotek do projektów.

C++ również ma typowe dla siebie konwencje dotyczące zapisu kodu.

#define ZAWSZE_Z_WIELKICH
using namespace std // evil, zabijają za to

class ClassName
{
public:
     void methodName();
};
void funkcjeCamelCasem(int parametryTez, int spacjeJakWPy)
{
//klamry od nowych linii
}
int main()
{
int normalneZmienneTakze;
}
std::cout<<"stosujemy operatory zasięgu zamiast globalnych namespace"<<"\n"<<"std::endl tylko w ostatecznosci";

Ten krótki kawałek kodu idealnie pokazuje konwencję używaną w C++, nazwy metod/funkcji tzw. „deep API” zapisuje się używając snake_case.

Należy wspomnieć, że zmiennych globalnych nie powinno się prawie w ogóle używać, a „using namespace” jest złym nawykiem, otóż wtedy może dojść do przysłonięcia się namespace’ów: programisty i tego z API.

Typowe rozszerzenie pliku to .cpp oraz .hpp.

Logo Cpp

C#

W pewnym sensie jest to język pochodzący od języka C(nie od C++!). Nazwa wskazuje, że jest to „wysokie C”, co w zupełności się zgadza. Jeśli chodzi o obiektówkę i składnię język jest bardzo podobny do Javy, pomimo tego, że posiada wiele słów kluczowych podobnych do C/C++. Pomimo wszelkich podobieństw jest on młodszy od wszystkich tych języków, powstał w 2000 roku, jest młodszy nawet ode mnie.

Konwencja w C# jest bardzo podobna do tej znanej z C/C++, a bardziej z Win32 API, czyli konwencji standardowej dla Microsoftu.

public class ClassName
{
    int VARIABLE;//tak są zapisywane zmienne(#define) globalne w Win32, gdzie w C# lepiej pisać camelCasem
    public static void MethodName()//nazwy metod z dużej litery
    {
         string tekst = "";
         if(tekst.Equals(""))
         {
            [DllImport("user32.dll",SetLastError=true)]
            mouse_event([In] dwFlags,
                        [In] dx,
                        [In] dy,
                        [In] dwData,
                        [In] (IntPtr)dwExtraInfo);//prawdziwa metoda deep API
         }
    }
}

Przede wszystkim konwencja Microsoftu wyróżnia się na tle innych, tym, że używa CamelCase, a nie camelCase do zapisu nazwy funkcji, klasy w Win32 API nie wystepują w ogóle. Typoe rozszerzenie pliku dla C# to .cs.

Logo C Sharp

Python

Język starszy od Javy, powstał w 1991, zaprojektowany przez Guido van Rossum. Jest to język skryptowy, interpretowany, co wyróżnia go mocno na tle trzech języków opisanych wyżej.

Powoduje to, że programy napisane w nim zużywaja niewiele pamięci oraz czasu procesora, radzi sobie bardzo dobrze w różnych zastosowaniach. Z założenia język jest dynamicznie typowany, ale posiada możliwość niejawnego castowania do konkretnego typu: str(), int() itd. W tym przypadku również posłużę się przykładowym pseudo kodem, aby pokazać użytą konwencję PEP8.

import x
from y import z


class foo(object):
    def __init__(self):
    # metoda prywatna
        self.z = "zawsze dwie linie wolne od include, zawsze 4 spacje"
 
    def method_name():
    # metoda publiczna

# spacja od hasha wymagana, tak samo pusta linia na koncu pliku
# nie więcej jak 79 znaków w linii

Konwencje w przypadku Pythona są bardzo istotne, gdyż stanowią one o scope’ie w tym języku. Obie wyżej pokazane metody są dostępne z zewnątrz, jedynie nazwą wskazano w jednym jak i drugim przypadku czy należy tej metody używać czy też nie. Wcięcia należy wykonywać koniecznie tabulatorami LUB spacjami(4 spacje dla indentu), mieszania interpreter „nie złapie”. W Pythonie używa się przede wszystkim snake_case, czasami camelCase, nie jest to istotne dla interpretowania języka, bardziej chodzi o wygodę programisty. Wedługo konwencji pliku z kodem ma rozszerzenie .py.

Logo Pythona

JavaScript

Java Script jak sama nazwa wskazuje język skryptowy. Zaprojetkowany przez Brendana Eicha w roku 1995. Używany najczęśćiej w web developerce, jednak dziś równie dobrze można w nim budować aplikacje desktopowe(WebView itd). Niegdyś załatwiał tylko front-end, dzisiaj jednak można w nim pisać back-end(node.js np), front-end i client zdalny. Dodatkowo jest to język prosty. Również tak jak Python nie posiada statycznego typowania, jednak ten nie posiada go w żadnej postaci. Jest w pełni zorientowany obiektowo.

Oprócz tego JavaScript ma swoją specyficzną składnię oraz budowę.

Ze wszystkich języków JS ma najluźniejsze zasady zapisu kodu. Case jest dowolny, ale preferowany to camelCase we wszystkich typach sygnatur:klas, funkcji, zmiennych. Zmienne globalne nie występują w JavaScript. Dodatkowo w teorii można w ogóle nie używać średników.

var ourModule = (function() {
    var _hiddenVar = 'tekst';
    var _visibleVar = 'tekst2';

    var _hiddenMethod = function() {
        console.log(_var + _var2);
    }

    var _print = function() {
        console.log(_var);
    }

    //wszystko co zwracamy staje się dostępne na zewnątrz, cała reszta będzie ukryta dla zewnętrznego środowiska
    return {
        print : _print,
        ourVar : _visibleVar
    }
})();

To przykładowy kod JS, widać w nim jak wygląda składania języka, zapis nazw funkcji(o ile nie jest to funkcja anonimowa), zmiennych, gdzie jest on troszkę inny niż standardowy. Jest tak, gdyż ten jest stary, pochodzi z wnętrza większej biblioteki, zatem nazwy zmiennych oznaczono jak widać poprzez dodanie na początek „_”, zwykle nazwa zmiennej zapisana jest jak następuje: camelCase. Typowe rozszerzenie dla plików z jego kodem to .js, a sam czysty język nie posiada swojego loga.

Podsumowanie – czy te konwencje są potrzebne?

Wszystko zależy od tego co robimy. Jeśli kod jest np. tylko dla nas, bardziej jako projekt otwarty, w którym pracujesz sam lub z kolegą/kolegami to konwencje czy ich brak nie ma większego znaczenia, gdzie jednak osobiście zalecam ich używanie. Co innego, gdy mowa o dołączeniu kodu do portfolio. W każdym języku konwencje były spisane w różnych momentach jego istnienia i na przykład w przypadku języka Java przestrzeganie wszystkich zasad konwnecji może mocno zaskodzić jakości kodu w momencie przekazania go do przejrzenia w firmie do, której aplikujemy. Z kolei w przypadku Python nie przestrzeganie konwencji skutkuje ogromnym spadkiem jakości, albo nawet tym, że kod w ogóle nie będzie działał, podobnie jest z C++ czy C#(oczywiście przestrzeganie konwencji Microsoftu nie jest zawsze właściwe).

Konwencje – czysty kod
Oceń ten post!

2 komentarze

  • Jakub Reply

    3 września 2017 at 18:14

    Coś pokręciłeś z tymi konwencjami stylu zmiennych w Javie.
    Zmienne lokalne i globalne variableName a stałe statyczne VARIABLE_NAME.
    Pozdrawiam Jakub

    • Łukasz Reply

      4 września 2017 at 17:19

      No to jest napisane. Constant: GLOBALVARIABLE czy tam GLOBAL_VARIABLE. Niestatyczne i/lub statyczne camelCase. Constant znaczy final, tj stale np jak definiunesz PI w kodzie do ktoregos tam miejsca. Nie chodzi o uzycie keyword static.

Zostaw komentarz

Login

Welcome! Login in to your account

Remember me Lost your password?

Lost Password