Zasady dobrego programowania

Zasady dobrego programowania
brodny
  • Rejestracja: dni
  • Ostatnio: dni
0

Co do goto, mija sie z zalorzeniami programowania strukturalnego :>

Możliwe, ale bardzo dobrze nadaje się do np. wyskakiwania z zagnieżdżonych pętli (notabene jedyne użycie instrukcji goto w całym kodzie VCL, a zrobiono taki zabieg chyba ze 2 razy jeśli wierzyć duetowi Teixeira-Pacheco).

//w pomocy do Delphi/BCB jest właśnie przykład użycia goto i sugestia, aby to stosować w takich przypadkach - M

// hmm, możliwe. Co do tych instrukcji: goto stosowałem tylko w szkole jak na szybko chciałem coś kumplowi udowodnić, continue i break, czasami używam, ale częściej udaje mi się skonstruować dobre warunki pętli. No chyba, że pętla bardzo rozbudowana, ja nie mam schematu i improwizuję :) No ale w końcu jest po to, żeby korzystać z tego - ŁB

Adam.Pilorz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2998
0
  1. Goto nie użyłem w Pascalu chyba nigdy. Może i jest czasami przydatne, ale nie spotkałem się z taką sytuacją.
  2. Użycia break i continue unikam, choć nie powiem, czy nigdy nie użyłem, bo nie pamiętam.
  3. Z zasadami wymienionymi przez Królika, poza tymi, których nie da się stosować do Pascala z różnych względów, zgadzam się.
  4. Wcale nie piszę czytelnego kodu, ale staram się to zmienić ;)
  5. Programuję od lat dwunastu, odkąd chodziłem do zerówki (no, w Pascalu, wcześniej w Logo - kto to nazywa programowaniem ;) - GWBasicu i Turbo Basicu).
    To chyba tyle :).
    //Dopisane: Nie chodzi mi o chwalenie się, tylko nie chcę znów zobaczyć tekstu: "To chyba mało programowałeś"...
TrOuBLE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 716
0

Co do break, return i continue to też słyszałem ploty że nieelegancko jest to stosować, ale tylko od wykładowców. Ja sam często z nich korzystam, jest to dla mnie wygodne. Co do goto, to nie używam w ogóle, uważam że akurat tej instrukcji nie powinno się stosować. Np. w Javie już w ogóle zrezygnowano z goto, zamiast tego pozostawiono wielopoziomowe break i continue.

  1. Programuję od lat dwunastu, odkąd chodziłem do zerówki (no, w Pascalu, wcześniej w Logo - kto to nazywa programowaniem ;) - GWBasicu i Turbo Basicu).

no nie chwal się już

Ktos
  • Rejestracja: dni
  • Ostatnio: dni
0
  1. Wcale nie piszę czytelnego kodu, ale staram się to zmienić

kwestia czytelności kodu jest zupełnie oddzielna, ale także się zawiera w zasadach dobrego programowania. Ale są rózni ludzi i rózne sposoby robienia wcięć itp. Aczkolwiek niektóre języki nie dają tutaj dowolności takiej jak C czy inny Pascal :)

Bulbin
  • Rejestracja: dni
  • Ostatnio: dni
0

Goto zazwyczaj mija się zupełnie z celem. Po co uzywać GOTO, skoro można podzielić kod na procedury? Jeżeli chodzi o zapętlenie, no to przecież najlepiej uzyć pętli, nie? A co do ASMa, to nie ywobrażam sobie kodu bez GOTO, ale to już zupełnie inna bajka.

Ja osobiście jeszcze nigdy nie użyłem GOTO (jedynie w BATCHu ;P ).

Adam.Pilorz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2998
0

kwestia czytelności kodu jest zupełnie oddzielna(...)

No nie całkiem... Bo używanie instrukcji break, continue i goto wpływa na czytelność kodu i o tym dyskusja. Parę moich przedmówców pisało, żeby używać czegokolwiek, byleby kod był czytelny. I właściwie generalnie się z tym zgadzam.

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0

sorry że tyle wklejam, ale niech ktoś mądry powie, jak pozbyć się break'ów z tego kodu tak, aby nie robić zbędnych porównań (nie sprawdzać w kilku miejscach wartości zmiennej n) :]
zwycięzca dostanie uśmiech sołtysa odciśnięty w betonie.

Kopiuj
begin
   h := 0;
   lasterror := 0;
   EnterCriticalSection(threadlock);
   if threadcount >= MAX_CONNECTIONS then
   begin
     printresult(format('CONNECTION REFUSED for socket %d (thread %d) [%d from %d]',[sock,self.Handle,threadcount+1,MAX_CONNECTIONS]));
     closesocket(sock);
     exit;
   end else threadcount := InterlockedIncrement(threadcount);
   LeaveCriticalSection(threadlock);

try
   printresult(format('CONNECTION OPENED for socket %d (thread %d) [%d from %d]',[sock,self.Handle,threadcount,MAX_CONNECTIONS]));

   while not Application.Terminated and (i <> WSAECONNRESET) do
   begin
     n := '';
     i := recv(sock,n[1],255,0);
     setlength(n,i);
     n2 := n;

     if (i <= 0) or (i = WSAECONNRESET) then break;

     if (n = 'QUIT') or (n = 'BYE') or (n = 'EXIT') then break; // semafor i tak zostanie zwolniony;

     if n = 'GETLASTERROR' then
     begin
       i := lasterror;
       send(sock,i,4,0);
     end else
     if copy(n,1,7) = 'CREATE ' then      // CREATE value max name
     begin
       if h <> 0 then // semafor na tym połączeniu już utworzony
       begin
         i := 0;
         send(sock,i,4,0);
         lasterror := TCP_SEMAPHORE_ALREADY_OPENED;
         break;
       end;

       delete(n,1,7);
       p1 := strtoint(copy(n,1,pos(' ',n)-1));
       delete(n,1,pos(' ',n));
       p2 := strtoint(copy(n,1,pos(' ',n)-1));
       delete(n,1,pos(' ',n));
       n := n + #0;

       i := CreateSemaphore(nil,p1,p2,pchar(@n));
       h := i;
       lasterror := GetLastError;

       send(sock,i,4,0);
     end else
     if copy(n,1,5) = 'OPEN ' then        // OPEN options inherit name
     begin
       if h <> 0 then // semafor na tym połączeniu już utworzony
       begin
         i := 0;
         send(sock,i,4,0);
         lasterror := TCP_SEMAPHORE_ALREADY_OPENED;
         break;
       end;
       delete(n,1,5);
       p1 := strtoint(copy(n,1,pos(' ',n)-1));
       delete(n,1,pos(' ',n));
       p2 := byte(copy(n,1,pos(' ',n)-1) = 'TRUE');
       delete(n,1,pos(' ',n));
       n := n + #0;

       i := OpenSemaphore(p1,boolean(p2),pchar(@n));
       h := i;
       lasterror := GetLastError;

       send(sock,i,4,0);
     end else
     if copy(n,1,5) = 'WAIT ' then        // WAIT timeout
     begin
       delete(n,1,5);
       p1 := strtoint(n); {timeout}

       i := WaitForSingleObject(h,p1);
       lasterror := GetLastError;
       send(sock,i,4,0);
     end else
     if copy(n,1,8) = 'RELEASE ' then    // RELEASE count => -1=ERROR
     begin
       delete(n,1,8);
       p1 := strtoint(n); {count}

       if (not ReleaseSemaphore(h,p1,@i)) then i := -1;
       lasterror := GetLastError;
       send(sock,i,4,0);
     end else
     if n = 'CLOSE' then     // CLOSE => -1=ERROR
     begin
       if h = 0 then // semafor na tym połączeniu nie był utworzony
       begin
         i := -1;
         send(sock,i,4,0);
         lasterror := TCP_SEMAPHORE_NOT_OPENED;
         break;
       end;

       if (not CloseHandle(h)) then i := -1 else begin i := 0; h := 0; end;
       lasterror := GetLastError;

       send(sock,i,4,0);
     end else
     begin
       i := -1;
       lasterror := TCP_SEMAPHORE_WRONG_COMMAND;
       send(sock,i,4,0);
       printresult(format('INCORRECT COMMAND: %s, CLOSING CONNECTION for socket %d (thread %d)',[n2,i,i,sock,self.Handle]));
       break; // zakończenie pętli
     end;


     printresult(format('GOT: %s, SENT: %d (%x) for socket %d (thread %d)',[n2,i,i,sock,self.Handle]));
   end; {w}

   printresult(format('CONNECTION CLOSED for socket %d (thread %d)',[sock,self.Handle]));

finally
  threadcount := InterlockedDecrement(threadcount);
  if not Application.Terminated then
  begin
    if h <> 0 then CloseHandle(h);
    closesocket(sock);
    Free;
  end;
end;
end;
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2964
0

8-0 Oto przyklad jak nie nalezy pisac..... To sie nazywa "spaghetti code". Mieszasz kilka funkcji (w sensie tego co program robi) w jednej procedurze. I dlatego ciezko wyeliminowac break.

// spaghetti czy guma do żucia - jak chcesz się z tego pozbyć breaków? - ŁF

Kooba
  • Rejestracja: dni
  • Ostatnio: dni
0

"spaghetti code"

[rotfl]

Dryobates
  • Rejestracja: dni
  • Ostatnio: dni
0

sorry że tyle wklejam, ale niech ktoś mądry powie, jak pozbyć się break'ów z tego kodu tak, aby nie robić zbędnych porównań (nie sprawdzać w kilku miejscach wartości zmiennej n) :]
zwycięzca dostanie uśmiech sołtysa odciśnięty w betonie.
(...)

Kopiuj
function create():Boolean;
begin
    if h <> 0 then // semafor na tym połączeniu już utworzony
    begin
	i := 0;
	send(sock,i,4,0);
	lasterror := TCP_SEMAPHORE_ALREADY_OPENED;
	Result := false;
	Exit();
    end;
    delete(n,1,7);
    p1 := strtoint(copy(n,1,pos(' ',n)-1));
    delete(n,1,pos(' ',n));
    p2 := strtoint(copy(n,1,pos(' ',n)-1));
    delete(n,1,pos(' ',n));
    n := n + #0;
    i := CreateSemaphore(nil,p1,p2,pchar(@n));
    h := i;
    lasterror := GetLastError;
    send(sock,i,4,0);
    Result := true;
end;

function open():Boolean;
begin
    if h <> 0 then // semafor na tym połączeniu już utworzony
    begin
	i := 0;
	send(sock,i,4,0);
	lasterror := TCP_SEMAPHORE_ALREADY_OPENED;
	Result := false;
	Exit();
    end;
    delete(n,1,5);
    p1 := strtoint(copy(n,1,pos(' ',n)-1));
    delete(n,1,pos(' ',n));
    p2 := byte(copy(n,1,pos(' ',n)-1) = 'TRUE');
    delete(n,1,pos(' ',n));
    n := n + #0;
    i := OpenSemaphore(p1,boolean(p2),pchar(@n));
    h := i;
    lasterror := GetLastError;
    send(sock,i,4,0);
    Result := true;
end;

function wait():Boolean;
begin
    delete(n,1,5);
    p1 := strtoint(n); {timeout}
    i := WaitForSingleObject(h,p1);
    lasterror := GetLastError;
    send(sock,i,4,0);
    Result := true;
end;

function release():Boolean;
begin
    delete(n,1,8);
    p1 := strtoint(n); {count}
    if (not ReleaseSemaphore(h,p1,@i)) then i := -1;
    lasterror := GetLastError;
    send(sock,i,4,0);
    Result := true;
end;

function close():Boolean;
begin
    if h = 0 then // semafor na tym połączeniu nie był utworzony
    begin
	i := -1;
	send(sock,i,4,0);
	lasterror := TCP_SEMAPHORE_NOT_OPENED;
	Result := false;
	Exit();
    end;
    if (not CloseHandle(h)) then i := -1 else begin i := 0; h := 0; end;
    lasterror := GetLastError;
    send(sock,i,4,0);
    Result := true;
end;

begin
   h := 0;
   lasterror := 0;
   EnterCriticalSection(threadlock);
   if threadcount >= MAX_CONNECTIONS then
   begin
 printresult(format('CONNECTION REFUSED for socket %d (thread %d) [%d from %d]',[sock,self.Handle,threadcount+1,MAX_CONNECTIONS]));
Kopiuj
     closesocket(sock);
     exit;
   end else threadcount := InterlockedIncrement(threadcount);
   LeaveCriticalSection(threadlock);

try

printresult(format('CONNECTION OPENED for socket %d (thread %d) [%d from %d]',[sock,self.Handle,threadcount,MAX_CONNECTIONS]));

Kopiuj
   while not Application.Terminated and (i <> WSAECONNRESET) and wynik do
   begin
     n := '';
     i := recv(sock,n[1],255,0);
     setlength(n,i);
     n2 := n;

     if (i <= 0) or (i = WSAECONNRESET) then 
	wynik := false;
     else if (n = 'QUIT') or (n = 'BYE') or (n = 'EXIT') then 
	wynik := false; // semafor i tak zostanie zwolniony;
     else if n = 'GETLASTERROR' then
     begin
       i := lasterror;
       send(sock,i,4,0);
       wynik := true;
     end else if copy(n,1,7) = 'CREATE ' then      // CREATE value max name
	wynik := create();
     else if copy(n,1,5) = 'OPEN ' then        // OPEN options inherit name
	wynik := open();
     else if copy(n,1,5) = 'WAIT ' then        // WAIT timeout
	wynik := wait();
     else if copy(n,1,8) = 'RELEASE ' then    // RELEASE count => -1=ERROR
	wynik := release();
     else if n = 'CLOSE' then     // CLOSE => -1=ERROR
	wynik := close();
    else
     begin
       i := -1;
       lasterror := TCP_SEMAPHORE_WRONG_COMMAND;
       send(sock,i,4,0);
   printresult(format('INCORRECT COMMAND: %s, CLOSING CONNECTION for socket %d (thread %d)',[n2,i,i,sock,self.Handle]));
Kopiuj
	wynik := false;
     end;

    if wynik then
 printresult(format('GOT: %s, SENT: %d (%x) for socket %d (thread %d)',[n2,i,i,sock,self.Handle]));
Kopiuj
   end; {w}

printresult(format('CONNECTION CLOSED for socket %d (thread %d)',[sock,self.Handle]));

Kopiuj
finally
  threadcount := InterlockedDecrement(threadcount);
  if not Application.Terminated then
  begin
    if h <> 0 then CloseHandle(h);
    closesocket(sock);
    Free;
  end;
end;
end;

Do funkcji trzeba oczywiscie poprzekazywac odpowiednie prametry. Sa tylko o 2 wiecej porownania, sprawdzajace wartosc zmiennej boolowskiej wynik.
Wciaz mi sie kod nie podoba, bo funkcja zajmuje mi 1,5 ekranu, ale nie mam ochoty wiecej tego przerabiac. Natomiast sprobowalbym zamiast kilka razy robic copy sprobowac wyciac raz tylko 5 pierwszych znakow i dla tych, co maja byc dluzsze niz 5, porownywac tylko z 5 pierwszymi znakami (albo lepiej 4 i zbic do 1 liczby). Oczywiscie o ile nie ma mozlisoci trafienia na inne tego typu "poczatki". W kazdym badz razie jezeli liczba tych mozliwych wartosci jest niewielka, to jakies haszowanie byloby wskazane.

P.S. nie, zebym byl przeciwnikiem calkowitego uzycia break, continue czy goto. Po prostu chcialem pokazac, ze to akurat da sie, zapisac bez break. Ale switch-a w C bez break, to raczej nie jestem w stanie napisac. Co więcej wcale nie chce. Czesto breaki stosuje w ifach. Goto raczej nie koniecznie...

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0

widzisz, da się, ale wymaga to całkowitego przemeblowania kodu, albo zmiany sposobu myślenia lub koncepcji kodu. nie zawsze się tak da, albo trzeba w to włożyć/nadłożyć dużo pracy. dalej nie czuę się przekonany o nieprzydatności break.

Embraced
  • Rejestracja: dni
  • Ostatnio: dni
0

break i continue uwazam za calkiem przydatne. Natomiast goto to inna para kaloszy. Uzycie goto wydaje mi sie praktyczne i pozyteczne jedynie przy wyjsciu z kilku petli na raz, inne 'porzadne' zastosowania nie przychodza mi do glowy (za to latwo o cala mase paskudnych rozwiazan uzywajac goto ;)).

HK
  • Rejestracja: dni
  • Ostatnio: dni
0

No to może ja jeszcze od siebie coś dorzucę...

Myślę że te zasady o których mówicie nie wynikają z tego że kod jest mniej lub bardziej czytelny gdy się stosuje te instrukcje lub nie. Nie wynikają również z optymalności uzyskanego w jednym czy drugim przypadku kodu.
Język programowania jest to po prostu język - fakt że bardzo specyficzny i operujący pewnymi schematami ale jednak język. Więc w pisanym kodzie programu liczy się nie tylko przekazana treść - algorytm - ale również styl w jakim został napisany. Tak samo jest w języku codziennym. Ktoś kiedyś uznał że bardziej elegancko jest powiedzieć poszedłem niż poszedłem, lub zaakcentować matematyka na trzecią od końca sylabę a nie na drugą (choć to drugie akurat uwarunkowane jest brzmieniem słowa z języka z którego zostało zapożyczone.
Tak samo jest również z instrukcją goto o której ktoś kiedyś się wyraził że jej użycie jest nieeleganckie i tak już pozozstało. Czy używać jej czy nie pozostawiam tylko Waszemu sumieniu.

Adam.Pilorz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2998
0

Ktoś kiedyś uznał że bardziej elegancko jest powiedzieć poszedłem niż poszedłem, lub zaakcentować matematyka na trzecią od końca sylabę a nie na drugą (choć to drugie akurat uwarunkowane jest brzmieniem słowa z języka z którego zostało zapożyczone.

No z tym to się nie zgodzę. To poszedłem czy inny akcent w matematyce (jak i w fizyce i paru innych naukach) są po prostu NIEPRAWIDŁOWE, nie nieeleganckie. Break i continue są jak najbardziej prawidłowe, powstaje tylko pytanie, czy eleganckie/czytelne itp. Co do goto, to w ogóle trudno jest powiedzieć. Niby jest w specyfikacji języka, jest czasem przydatne, ale sytuacje, kiedy rozjaśnia kod są naprawdę sporadyczne. To tyle.

HK
  • Rejestracja: dni
  • Ostatnio: dni
0

No zgoda z poszedłem rzeczywiście się trochę zapędziłem - jest nieprawidłowe. Ale matematyka z drugą sylabą od końca akcentowaną jest prawidłowe tyle że nie eleganckie, dlatego nie należy używać takiego akcentu w oficjalnych przemówieniach, ale wrozmowie prywatnej jest dozwolone. Jest to zresztą naturalny proces językowy który zmierza ku ujednolicaniu zasad.

PS A pomijając już reguły polszczyzny - pytanie było czy zasady dobrego programowania mają jakieś znaczenie praktyczne to odpowiem że moim zdaniem nie chociaż staram się ich przestrzegać

vixen03
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 475
0

w slowach kluczowych break, continue, goto nie chodzi o czytelnosc ale o to, ze wychodza one poza zakres bez wywolania destruktora (przynajmniej w c++) i powoduje to powolne wyciekanie pamieci;

Deti
  • Rejestracja: dni
  • Ostatnio: dni
0

w slowach kluczowych break, continue, goto nie chodzi o czytelnosc ale o to, ze wychodza one poza zakres bez wywolania destruktora (przynajmniej w c++) i powoduje to powolne wyciekanie pamieci;

OT: break, continue, goto nie są słowami kluczowymi.

// Dopisanie do postu Dryobates: hmm miałem na myśli Delphi [ ehh to przyzwyczajenie ] .. a tam można.

Dryobates
  • Rejestracja: dni
  • Ostatnio: dni
0

w slowach kluczowych break, continue, goto nie chodzi o czytelnosc ale o to, ze wychodza one poza zakres bez wywolania destruktora (przynajmniej w c++) i powoduje to powolne wyciekanie pamieci;

OT: break, continue, goto nie są słowami kluczowymi.

OT do OT: jak najbardziej są słowami kluczowymi. Nie możesz ich zamaskować. Nie da się stworzyć zmiennej o takiej samej nazwie (oczywiście mówię tutaj o wspomnianym c++).

  • Rejestracja: dni
  • Ostatnio: dni
0

CONTINUE, BREAK, EXIT to w zasadzie GOTO tylko inaczej pisane! O jeszcze HALT.
GOTO - zdarza się sytuacja kiedy bez tego ani rusz, przed taką koniecznością w ciągu wielu lat stanąłem może parę (nie kilka a parę) razy, BREAK, CONTINUE, EXIT, w maleńkim bloczku wcale nie szkodzą, a pomóc mogą, ale zwykle jakoś je jednak zaznaczam, piszę wielkimi literami (Pascal nie jest czuły na wielkość liter) lub lądują w nowym wierszu i pierwszej kolumnie.
Teoria mówi, że ZAWSZE można obejść się bez GOTO, czyli i bez CONTINUE itp. Pętle to też inna pisownia GOTO, więc też się można bez nich obejść. Czyli jeżeli programowanie strukturalne to zapominamy o GOTO (to ścierpię) BREAK, CONTINUE, EXIT, HALT, FOR, WHILE, REPEAT!!! (i jeszcze parę innych)
Co jeszcze mówi teoria? Że na komputerze można zrobić wszystko co opiera się na rekurencji, czyli wszystko co się da, da się zrobić rekurencyjnie! I tylko dzięki temu możemy pozostać w zgodzie z zasadami. ;-)
Weźmy prosty przykład, CAR (Computer Aided wydawanie Reszty) ;-).
Wpisujemy liczbę, musimy podać ile i których nominałów potrzebujemy, całość parę linijek. Zróbmy to rekurencyjnie! Prosta zabawka, a zajęła mi ponad pięć minut. Polecam ot tak dla gimnastyki.
Czy da się to zrobić bez nawiasów strukturalnych BEGIN END (?{? i ?}? dla C)?
Dodałem jeszcze parę żartów.

(***************** wspólny początek **************************)
const nom:array [1..13] of single=
(200, 100, 50, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01);
var r: single;

(********* wersja dla purystow ********************************)
function reszta(r: single; i, j: longint):longint;
begin
if r>=nom[i] then
reszta:=j+reszta(round((r-nom[i])*100)/100, i, j+1)
else begin
writeln(j:4, nom[i]:8:2);
if r>0 then reszta:=reszta(r, i+1,0);
end;
end;

begin
readln(r);
reszta(r, 1, 0);
end.

(**** wersja do profilowania, dla tych którzy optymalizują *****)
begin
repeat
readln(r);
if r<=0 then halt;
i:=1;
while r>0.001 do begin
j:=0;
while r>=nom[i]-0.001 do begin
r:=r-nom[i];
j:=j+1;
end;
if j>0 then
writeln(j,'*',nom[i]:0:2,', ');
inc(i)
end;
writeln;
until false
end.

(********************* ASM Basic Fortran *********************)
begin
repeat readln(r);
if r<=0 then
halt;
i:=1;
while :D r>0.001 do begin
j:=0;
while r>=nom[i]-0.001 do begin
r:=r-nom[i]; inc(j);
end; if j>0 then
writeln(j,'
',nom[i]:0:2,', ');
inc(i)
end; writeln;
until false
end.

(****************** wersja szkocka (oszczędna) ***************)
begin repeat readln(r); if r<=0 then halt; i:=1; while
r>0.001 do begin j:=0; while r>=nom[i]-0.001 do begin
r:=r-nom[i]; inc(j); end; if j>0 then writeln(j,'
',
nom[i]:0:2,', '); inc(i) end; writeln; until false end.

(******** COBOL, albo firma w której płacą "wierszowke" ******)
begin
readln(r200);
writeln(trunc(r200/200), '
200.00 zł');
r100:=r200-trunc(r200/200)200;
writeln(trunc(r100/100), '
100.00 zł');
r50:=r100-trunc(r100/100)
................

                Wesołych Świąt.
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2964
0

PS A pomijając już reguły polszczyzny - pytanie było czy zasady dobrego programowania mają jakieś znaczenie praktyczne to odpowiem że moim zdaniem nie chociaż staram się ich przestrzegać

Moim zdaniem mają bardzo duże. Jak przyjmujemy kogoś do pracy, to zwykle lubimy sobie popatrzeć na jego kod. Pierwsza minuta patrzenia mówi wszystko... Myślę, że to czy ktoś dostanie pracę, czy nie to jest bardzo PRAKTYCZNA sprawa.

Takich programistów nie przyjmujemy:

Kopiuj
char ntr[100];
strncpy((char*)ntr, (char*)Name.GetCString(),strlen((char*)Name.GetCString()));
ntr[strlen(ntr)-2]='\0';

A takich owszem:

Kopiuj
TString NameWithoutDot = Name;
if (NameWithoutDot.EndsWith("."))
        NameWithoutDot.DeleteLast(".");

Oba fragmenty robią prawie to samo, ale różnica w "stylu kodowania" jest wyraźna.

BTW: Pierwszy fragment wygląda bardziej "hackersko", ale niestety ma 2 bardzo poważne błędy. Kto zgadnie, gdzie? :)

vixen03
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 475
0

poza tym owe slowa sa w c++ tylko dlatego, ze sa w c, dla zachowania zgodnosci, a w delphi pewnie dlatego, ze sa w pascalu. gdyby nie to, prawdopodobnie zostalyby usuniete z jezyka.

Dryobates
  • Rejestracja: dni
  • Ostatnio: dni
0

vixen: tak, masz racje, w c++ sa tylko dlatego, ze sa w c... ale ciekaw jestem, czy switch w ogole uzywasz w c++ czy nie...

Co do wersji szkockiej... Mam znajomego, który tak pisał... Ale on miał swoje uzasadnienie. Ponieważ miał maluteńki dysk (20MB) na starym komputerze (386) i wszystko musiał trzymać na dyskietkach, to to był jego sposób pakowania programów :P

  • Rejestracja: dni
  • Ostatnio: dni
0

Wielu matematyków pisze po szkocku

Bełdzio
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 729
0

to może jakiś zawodowiec poświęci się i napisze o tym arta ??? żeby adepci tej mistycznej sztuki wiedzieli co robić, a czego nie

Kooba
  • Rejestracja: dni
  • Ostatnio: dni
0

to może jakiś zawodowiec poświęci się i napisze o tym arta ??? żeby adepci tej mistycznej sztuki wiedzieli co robić, a czego nie

ale jak to, przecież w końcu sie nie dogadaliśmy które zasady mają sens, a które nie itd... :|

Bełdzio
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 729
0

dlatego ktoś kto ma o tym pojęcie mógłby spisać to co wg niego jest najważniejsze, a później najwyżej wprowadziłby jakieś modyfikacje :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.