Monday, November 12, 2007

OJP część E

W całym programie stosujemy ten sam styl wcięć. Jeżeli szef nakazuje używać K2R to używamy K2R choćbyśmy całe życie używali czegoś innego.




K2R:


for (int i=0; i <= 100; i++) {
-> ...

-> ...

-> ...

}


// wada nie można jednym komentarzem sprawić by pętla wykonała się tylko raz.

// Styl Almana eliminuje ten problem:

// pętla leci tylko raz nie da się tego zrobić w K2R for (int i=0; i <= 100; i++)
{
-> ...
-> ...
-> ...
}


//Tabulacje zamieniamy na spacje. Bo nie ma wtedy problemu przy przeniesieniu z Linux-a na MAC-a programu, w którym zgadzają się wcięcia. Najlepiej jest mieć edytor, który automatycznie umie robić to za nas.

Taki komentrz jest problematyczny

/*

/* */

*/


Nie zadziała wyłączenie sekcji kodu.


Inna metoda wyłączania kodu


#ifndef 0

//

/*

*/

#endif

i tutaj zadziała :)

Dodatkowo, możemy opisywać każdy plik podając na przykład:

autora
data utworzenia
data ostatniej modyfikacji.

Opisujemy też każdą klasę mówiąc (nie programistycznie, ale tak z punktu widzenia modelowanej rzeczywistości) co przedstawia i co robi.

Komentujemy każdą metodę, mówiąc co robi (z punktu widzenia modelowanej rzeczywistości)

Komentujemy trudniejsze kawałki kodu, mówiąc co robią (ogólnie co robi dany kawałek kodu) jeżeli nie widać explicite co robi.

Parametry w stylu "zmienna = "wartosc"" podajemy w plikach nagłówkowych *.h, nie w plikach *.cpp - dodatkowo, jeżeli sparametryzujemy wszystkie parametry np. konstruktora to jest to automatycznie konstruktor domyślny: konstruktor();
Wirtualizacja:
Robimy wirtualizację. Czyli robimy metody czysto wirtualne + destruktor musi być wirtualny.
Zasada substytucji Liskova mówi o tym, że jeżeli wszystkie klasy bazowe zastąpimy pochodnymi to działa nadal poprawnie.

Tuesday, November 6, 2007

Django, Rails, Pylons - zdobywanie informacji

Nie licząć blogów programistów to najlepiej informacje zdobywać:

O Pylon i Django na stronach poświęconym Rails.
O Rails na stronach poświęconych Pylon i Django.

To właśnie tam zawarte informacje nie dopełniają informacji pisanych przez fanów konkretnych rozwiązań. Wciąż brakuje mi obiektywnej tabelki rodem z chip-a, gdzie byłoby po prostu porównanie wszystkich frameworków i możliwość "spojrzenia" co mi odpowiada a co nie. A szkoda - bo czy to, że ma się wybór pomiędzy prostotą a meandrami kreatywności jest złe ?

Monday, November 5, 2007

Obiektowe języki programowania - część D

Mowa o wyjątkach...

Zwykła obsługa błędów w C

int sprawdz_saldo() {
...
return saldo;
}

1) Musimy poświęcić jakieś wartości na kod błędu (jaką ? -1, 0.1, -0.9999)
2) Trzeba sprawdzać w kodzie czy funkcja zakończyła się powodzeniem czy nie i reagować na niepowodzenia
3) Nie możemy wymusić na programiście reagowania na kody błędów
4) Program zaczyna wyglądać:

// spaghetti - code

if (funkcja(x) == -1) {
// Reakcja na blad
} else {
// Poprawny kod
}
if (function(y) == -1) {
// Reakcja na blad
} else {
// Poprawny
}

Czyta się potwornie nie wygodnie. Wady te niwelują wyjątki.

Zgłaszanie wyjątku:

// Definicja klasy, ktora zwracamy jako wyjatek

class blad_zakresu() {};
class blad_db() {};

void ustaw_rok_prod (int x) {
// blad_zakresu x;
// throw x; // Nazwany obiekt - x.
if (x <>> dane;
s >> dane;
if (!s) // oops
// Zanim zareagujemy na daną sprawdźmy czy strumień jest ok bo dane nie zostaną wczytane
// Może być tak, że EOF będzie powodował błąd więc ostatni odczyt powinien robić coś takiego:
if (!s && s.eof) // koniec pliku
if (!s && !s.eof) // błąd nie koniec pliku

// Strumieni same zgłaszają wyjątki

Polecane książki:
http://www.josuttis.com/
http://wysylkowa.pl/ks239250.html
Język C++

jezyk c++
Stroustrup Bjarne

Thursday, November 1, 2007

latex pod PHP

Kiedy zacząłem używać polecenia latex poprzez php - system() ... zaczął wyskakiwać komunikat:
This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) I can't find the format file `latex.fmt' PHP
Plik latex.fmt znalazłem o dziwo w /home/dziubdziub/.texmf-var/web2c/latex.fmt.

Ponieważ linijka PHP wyglądała mniejwięcej tak:

system('/usr/share/texmf/bin/latex -output-directory='.TMP.'songbooks '.TMP.'songbooks/'.$name.'.tex');
Przekopiowałem ten plik do katalogu wskazanego przez -output-directory i zaczęło działać :)

Wednesday, October 31, 2007

Dwa pudełka

Trzymam w dłoniach dwa pudełka,
dostałem je od Pana Boga.
On powiedział:
"Wszystkie swoje smutki włóż do czarnego,
zaś wszystkie radości do złotego".

Posłuchałem Jego słów i napełniłem oba pudełka
moimi smutkami i radościami.

Chociaż złote pudełko co dzień stawało
się coraz cięższe, czarne ważyło ciągle tyle samo.

Chciałem dowiedzieć się, dlaczego tak jest,
z ciekawości więc otworzyłem to czarne
i zobaczyłem w dnie pudełka dziurę -
moje smutki wypadły przez nią.

Pokazałem dziurę Panu Bogu i głośno
się zastanawiałem:
"Ciekawe, gdzie się podziały
wszystkie me smutki".

Pan uśmiechnął się do mnie czule.
"Moje dziecko, wszystkie twe smutki
są tutaj, ze Mną".

Boże, dlaczego dałeś mi te pudełka:
Spytałem: "Panie jedno złote,
a drugie czarne i dziurawe?"

"Moje dziecko, złote jest po to,
by policzyć dane ci łaski,
czarne jest po to, byś pozbył się smutków".

Monday, October 29, 2007

Serializacja w C++

Serializowanie to metoda na zapisanie pełnego stanu naszej klasy.

class samochod {
void zapisz (ofstream & s); // Metoda przyjmuje wyjściowy strumień plikowy jako parametr
void odtworz(ifstream & const s); // stały: bo nie zmianiamy jego zawartości
}

void Samochod::zapisz (ofstream & s) {
s << marka << endl;
s << rejestracja << endl;
}

Klasa typu POD:
-> Nie ma konstruktora
-> Nie jest wirtualna
-> Nie ma elementów składowych innych niż stanadrowe (nie może być string, vector itd...)

Jeżeli klasa nie jest typu POD wtedy nie da się zapisać jej za pomocą "adres -> sizeof(class)" ponieważ posiada elementy dynamiczne.

#include

void Samochod::odtworz (ifstream & s) {
getline(s, marka);
getline(s, rejestracja);
}

main() {
ifstream s("plik.txt");
s.open("plik.txt");

s.close
// Tutaj samo się zamknie (robi to destruktor)
}

Sunday, October 14, 2007

ZHR : Za mało czasu na śmierć

W związku ze śmiercią ks. prałata hm. Zdzisława Peszkowskiego naszła mnie pewna refleksja. Nie pojechałem na Turbacz ponieważ przyjechał do mnie na weekend chrzestny, którego nie widziałem naprawdę dawno. W oczekiwaniu na przyjazd mojego chrzestnego do rodzinnego miasta zdążyłem spędzić trochę czasu z qmplami z Kręgu, pozałatwiać kilka spraw związanych ze studiami, wpaść w odwiedziny do Ciechocinka w celu wyjaśnienia co i jak ze śpiewnikiem, nacieszyć się nowo dostanym laptopem i kilka innych mniej lub bardziej czasochłonnych spraw. Pewna refleksja:

Starając się działać aktywnie w HOPRe, pełniąc służbę w Kręgu, użerając się z całą kretyńską biurokracją ZHRu, pisząc projekty dla ZHR, pomagając innym w sprawach informatycznych gdzie powinno się w ramach pełnionej służby ... gdzie kalendarz imprez harcerskich pęka w szwach... gdzie trzeba znaleźć jeszcze czas na bycie mężem, synem, wnukiem, studentem, chrześniakiem, przyjacielem... czy jest jeszcze czas aby zatrzymać się. Czy harcerza na czas ba czyjąś śmierć ? Czy strażnik ma czas na śmierć innego harcerza ? Czy harcerz w ogóle ma czas na coś poza harcerstwem ? Czy idee nadal służą nam czy to my zaczynamy służyć ideom ? Czy nie zatracamy się ... w naszym harcerstwie.... nie mając już czasu na normalne życie ?

................................