Odpowiedz na ten temat
Strona 1 z 12 1 2 3 4 5 11 ... OstatniaOstatnia
Pokaż wyniki od 1 do 10 z 112

  1. Dołączył
    Jul 2008
    Postów
    67

    Cytuj | #1

    Witam wszystkich po długim czasie jaki minął od ostatniej części.
    Problemy techniczne - internet też rzecz i czasami siada , ale nie ma co się rozpisywać w innym temacie.
    Bierzemy się już za programowanie.

    Obiektowość. Klasy -z czym to się je

    Aby dobrze pojąć takie coś jak obiekt (object) i klasa (class) potrzebne nam jest na początek tylko i wyłącznie poprawne rozumowanie obiektów otaczających nas dookoła. A dokładnie chodzi o proste powiązania rzeczy/istoty żywej oraz to co mogą robić czy jak się zachowywać.
    Weźmy np. człowieka. Ów człowiek jest klasą (class), Ogólna postać człowieka opisuje nam każdego człowieka jak np. "Józek", który jest obiektem tej klasy (człowieka).
    Człowieka potrafi chodzić, mówić, jeść etc. - są to funkcje które mu przypisujemy. Funkcje te w klasach są nazywane metodami. Człowiek nasz posiada także różne cechy takie jak: kolor, imię i nazwisko, wiek etc.
    Idąc dalej tym tropem mamy:
    1. Klasa: człowiek
    2. Cechy: nazwisko, wiek
    3. Funkcje/Metody: chodzenie, mówienie
    Z klasy (człowiek) tej wywodzi się nasz obiekt (Józek),
    Jak widać klasa (class) to opis obiektu (object).

    Człowiek należy również do jakiegoś gatunku t.j. ssak naczelny. I wywodzi się właśnie z niego. Można powiedzieć, że dziedziczy pewne cechy oraz funkcje od tego gatunku, czyli jest jakby jego potomkiem. W programowaniu nazywamy to inheritance czyli dziedziczenie - praktycznie nierozłączna część programowania w Objective C.
    Już od samego początku poznamy i zaprzyjaźnimy się z dziedziczeniem, ale tylko w podstawowej jego części - reszta w dalszych częściach kursu.

    Każdego człowieka możemy zapytać np o wiek czy o nazwisko czy również możemy także, jeśli np jest to nasz pracownik polecić aby coś zrobił, chociaż nie zawsze musi wiedzieć jak (o tym będzie w innej części kursu). Możemy nawet zmienić ich cechy (chociaż nie zawsze ). Tak samo jest w programowaniu obiektowym, możemy zapytać obiekt o różne jego cechy lub je nawet zmienić, jak i polecić coś zrobić. Czynność taka nazywa się w ObjC messages, czyli inaczej hmm... wiadomość dla obiektu - ja to zawsze sobie biorę za polecenie.
    Polega to na zasadzie, iż jeśli chcemy komuś wysłać wiadomość/polecenie musimy wiedzieć do kogo ją zaadresować. Ten ktoś jest nazywany odbiorcą - receiver, a nadawca - sender.
    Wygląda to tak:
    Kod php:
    [odbiorca wiadomosc/polecenie
    Gdzie wiadomość/polecenie to metoda obiektu, czyli naszego odbiorcy. A odbiorca to obiekt.

    Myślę, że tak krótki opis co to jest obiekt wystarczy.
    Przejdziemy teraz do tworzenia obiektów w Objective C oraz ich używania.

    Składnia

    Od tej pory będę tylko używał określenia metoda dla określenie polecenia czy funkcji, czy wiadomość (tu message) klasy/obiektu.
    Każda klasa jest deklarowana poprzez
    Kod php:
    @interface NaszKlasaKlasaPoKtorejDziedziczymy
    {
      
    // cechy klasy
    }

    //metody/polecenia
    @end 
    Cechy klasy tworzymy poprzez normalne deklaracje zmiennych, czyli np:
    Kod php:
    int wiek;
    NSString *nazwisko
    Metody/polecenia obiektu (nie klasy) tworzy się poprzez:
    Kod php:
    -(typ jaki zwraca metodymetoda;
    -(
    typ jaki zwraca metodymetoda: (typ argumentuargument;
    -(
    typ jaki zwraca metodymetoda: (typ argumentuargument iDrugiAgrument:(typ drugiego argumentudrugiArgument
    Gdzie "typ jaki zwraca metoda" może zostać pominięty. Ale ten temat zostawimy na cześć kursu o dziedziczeniu.
    "metoda" jest także nazwą argumentu, jeśli takowy istnieje, bądź wskazówką dla pierwszego argumentu.
    W 3 przykładzie metody nazwa "iDrugiArgument" jest opcjonalna, ale dla czytelności kodu lepiej używać nazw argumentów. Przykład:
    Z nazwą argumentu:
    Kod php:
    -[czlowiek ustawNazwisko: @"nazwisko" iWiek25
    I bez nazwy argumentu:
    Kod php:
    -[czlowiek ustawNazwisko: @"nazwisko" 25
    Także sam/a stwierdź, który sposób jest lepszy -czyt. bardziej czytelny.

    Natomiast definicja/implmentacje naszej klasy wyglada tak:
    Kod php:
    @implementation NaszaKlasaKlasaPoKtorejDziedziczymy
    // definicje metod/implementacje
    -(type jaki zwraca metodametoda
    {
    }


    -(
    typ jaki zwraca metodametoda: (typ argumentuargument
    {
    }

    @
    end 

    Na podstawie tych wiadomości możemy już stworzyć klasę naszego Człowieka
    Kod php:
    @interface CzlowiekNSObject
    {
       
    int wiek;
       
    NSString *nazwisko;
    }
    -(
    voidustawNazwisko: (NSString *) n;
    -(
    voidustawWiek: (int) w;
    -(
    voidustawNazwisko: (NSString *) n iWiek: (int) w;

    -(
    NSString *) nazwisko;
    -(int) 
    wiek;
    @
    end

    @implementation Czlowiek
    -(voidustawNazwisko: (NSString *) n
    {
        
    nazwisko n;
    }

    -(
    voidustawWiek: (int) w
    {
        
    wiek w;
    }

    -(
    voidustawNazwisko: (NSString *) n iWiek: (int) w
    {
        
    nazwisko n;
        
    wiek w;
    }

    -(
    NSString *) nazwisko
    {
        return 
    nazwisko;
    }

    -(int) 
    wiek
    {
        return 
    wiek;
    }

    @
    end 
    NSObject jest obiektem bazowym. Którego będziemy używać na razie jak coś co musi być . Kiedy przejdziemy do dziedziczenia to omówimy sobie go.
    NSString jest klasą napisów z biblioteki Foundation. Będziemy jej używać do manipulacji tekstem.
    Napisy z NSString tworzy się w ten sposób:
    Kod php:
    NSString *napis1 = @"Tworzy sie je jeszcze inaczej";
    NSString *napis2 = @"Ale dla naszych potrzeb wystarczy"
    A żeby użyć tego napisu przez np. funkcje printf, potrzebujemy wysłać metodę o napis w stylu C:
    Kod php:
    printf("%s", [napis1 cString]); 
    Metody ustawNazwisko, ustawWiek oraz ustawNazwisko: iWiek są tak zwanymi setterami.
    Nazwa wzięła się z angielskiego i znaczy to ustaw (set). Normalnie by to wygladało tak:
    Kod php:
    -(voidsetName: (NSString *) n;
    ... 
    a (int) wiek; to tak zwany getter, czyli pobierz od angielskiego get. Zauważ, że nazwa metody gettera jest taka sama jak cechy/zmiennej klasy. Możesz użyć nazwy jakiej chcesz, ale użycie tej samej nazwy jest bardziej czytelne i zrozumiałe.

    Klasa człowieka, którą stworzyliśmy poprzez @interface, to tylko informacja co zawiera nasz klasa. Do tego potrzeba jeszcze dorobić implementacje.
    Implementację umieszcza się zazwyczaj w plikach do kompilacji czyli w przypadku Objective C są to pliki z końcówką .m Natomiast pełną deklarację (@interface) umieszczamy w standardowym pliku nagłówkowym z C czyli .h
    Aczkolwiek nie jest to wymóg i można umieszczać i deklaracje i implementację w jednym pliku .m, jak i my to zrobimy dzisiaj (tylko dla celów edukacyjnych ), lepszą praktyką jest umieszczanie deklaracji w osobnym pliku nagłówkowym t.j. .h, który nie jest kompilowany, a tylko dołączany poprzez dyrektywę #import

    Teraz jak już mamy nasz opis (klasę) człowieka możemy stworzyć "Józka".
    Wygląda to mniej więcej tak:
    Kod php:
    Czlowiek *jozek;
    jozek = [Czlowiek alloc];
    jozek = [jozek init]; 
    Wszystkie obiekty podczas ich deklaracji muszą być poprzedzone gwiazdką "*", ponieważ są to wskaźniki (referencje) do tych obiektów. Więcej na ten temat w dalszych częściach kursu.
    Każdy obiekt musi mieć przydzieloną pamięć - alloc oraz być zainicjowanym - init.
    Pamięć przydziela się poprzez wywołanie metody alloc z klasy, która jest dziedziczona po NSObject.
    Metoda alloc jest metodą klasy nie obiektu - o tym trochę później, który zwraca typ. Natomiast metoda init jest wywołana już dla naszego obiektu. Jest ona dziedziczona również poprzez NSObject.
    Na razie musimy tylko wiedzieć, że za każdym razem jak tworzymy obiekt to musimy go w ten sposób utworzyć .

    Powyższy zapis tworzenia obiektu możemy skrócić do:
    Kod php:
    Czlowiek *jozek = [[Czlowiek allocinit]; 
    Pilega to na tym, iż możemy zagnieżdżać wysyłanie wiadomości do obiektów pamiętając, że najpierw pierwszeństwo w dostawaniu wiadomości ma obiekt bliżej środka. Czyli najpierw Czlowiek potem obiekt przez niego stworzony w naszym przypadku "jozek".

    Po stworzeniu naszego obiektu musimy go zawsze zwolnić poprzez wysłanie do obiektu metody release:
    Kod php:
    [jozek release]; 
    Na sam koniec już dzisiejszej części kursu zostało nam zrobić jeszcze program który to przetestuje:

    Kod php:
    #import <stdio.h>
    #import <Foundation/NSObject.h>
    #import <Foundation/NSString.h>

    ZAMIAST TEGO TEKSU WSTAW KLASE CZLOWIEK

    int main
    (int argcchar *argv[])
    {
        
    Czlowiek *jozek = [[Czlowiek allocinit];

        [
    jozek ustawNazwisko: @"panaNazwisko"];
        [
    jozek ustawWiek25];
        
        
    printf("%s ma %d lat.\n", [[jozek nazwiskocString], [jozek wiek]);
        
        [
    jozek ustawNazwisko: @"paniNazwisko" iWiek24];    
        
    printf("A %s ma %d lat.\n", [[jozek nazwiskocString], [jozek wiek]);
            
        
        [
    jozek release];

        return 
    0;


    Pozdrawiam.


    ************************************************** ************************************************** *
    Ćwiczenie:
    Stworzyć kilka klas oraz po kilka metod do nich razem z cechami.
    Może to być: samochód, telewizor, mp3 itp itd;

    Tylko pamiętajcie żeby dziedziczyć po NSObject.


    POPRZEDNIE CZĘŚC KURSU:
    01. Wprowadzenie
    02. Konfiguracja i instalacja
    Ostatnio edytowane przez 51m0n ; 05.12.2008 o 23:54
    私の名前はSannindanです!
    Watashi no namae wa Sannindandesu!
    www.wymarzonydom.com.pl



  2. Dołączył
    Aug 2007
    Skąd
    Kraków
    Postów
    263

    Cytuj | #2

    Bardzo się cieszę, że ktoś ruszył temat podstaw programowania w objective C. U nas cały czas posucha na tym polu. Przykłady kodu przejżyste i jasne. Natomiast w tekście jest po prostu gigantyczna ilość literówek, które mi przeszkadzają.
    Druga sprawa:
    Wszystkie obiekty podczas ich deklaracji muszą być poprzedzone gwiazdką "*", ponieważ są to wskaźniki (referencje) do tych obiektów
    To zdanie mocno nadszarpnęło moje zaufanie do szanownego Autora i nie jestem już taki pewny czy wie o czym pisze. Mam nadzieję że to tzw. "skrót myślowy" ponieważ referencje, mimo podobnego efektu, to jednak są inną metodą manipulowania danymi niż wskaźniki i np w C++ dysponują własnym operatorem (&) dla odróżnienia od wskaźnika (*)
    Ostatnio edytowane przez radekw ; 05.12.2008 o 09:35
    Komputer: Macbook Pro (Tiger), iMac (Leopard)
    Telefon: iPhone 3G
    Odtwarzacz: iPod Touch


  3. Dołączył
    Aug 2007
    Postów
    11

    Cytuj | #3

    Wielkie dzięki sannindan. Naprawdę robisz dobrą robotę.


  4. Dołączył
    Jan 2006
    Postów
    63

    Cytuj | #4

    sannindan: Niby wszystko ok, kawal dobrej roboty. Ale...
    Po pierwsze po jaka cholere wprowadzasz polskie nazewnictwo w "setterach": np.: "ustawWiek:". Co to w ogole jest?

    Po drugie. Programistom, ktorzy uzywaja MacOSX wprowadzasz troche zamieszania. Metoda "cString" klasy NSString jest deprecated, a w iPhone SDK w ogole jej nie ma. Zaleca sie takze stosowanie NSLog zamiast printf... Nie wiem jak pod innymi platformami, ale moze chociaz jest "UTF8String" - tej metody mozna smialo uzywac na OSX, (w iPhoneSDK tez jej niestety nie ma, jest za to "cStringUsingEncoding:").
    Ostatnio edytowane przez Smuggi ; 05.12.2008 o 11:42 Powód: Wpisy zostały automatycznie połączone


  5. Dołączył
    Jul 2008
    Postów
    67

    Cytuj | #5

    @radekw
    Pamiętaj, że ty mówisz o referencjach w C++ - a tutaj to coś nowego i innego.
    Natomiast w programwoaniu obiektowym (z garbage collectors) wszystkie obiekty które są tworzone są tylko referencjami! do danego obiektu. Tzn nazwa zmiennej która reprezentuje dany obiekt jest referencją.
    Jest tak w Java, jest tak w C# i jest tak w Objective C. Z tym, że w tych dwu pierwszych nie ma czegoś takiego jako operator * przed deklaracją zmiennej obiektowej,
    Zauważ jeszcze, że C++ nie jest jezykiem obiektowym, a tylko posiada jako taką obiektowść jako jeden z paradygmatów programwoania.
    No i co najważniejsze aby dobrze pojąć Objective C, bardzo dobrze byo by się wyzbyć przyzwyczajeńz innych jezyków, które oferują obiektowość takich jak m.in. C++. A najlepiej by było nie umieć żadnego z nich.

    @Smuggi
    Widzę, że już się czepiłeś mnie od samego początku i do konća nie wiem za co. Bo jeśli tylko za to, że prowadzę ten kurs, to ehh szkoda gadać.

    Po pierwsze po jaka cholere wprowadzasz polskie nazewnictwo w "setterach": np.: "ustawWiek:". Co to w ogole jest?
    Jak wiesz, to jest pierwsza lekcja z programowania. I nie każdy potrafi po angielsku.
    Jakie jest nazewnictwo, to każdy sobie robi po swojemu! Pamiętaj, że, to że jest w angielskiej literaturze słowo set i jest napisane, ze się powinno tego używać do setterów, to nie znaczy że tak musi być w innym języku! Jesli mi się podoba uzywać ustaw zamiast set słowa ustaw to moja sprawa.
    I zauważ jeszcze raz: JEST TO ROBIONE DLA CZYTELNOŚCI I UŁATWIENIA POCZĄTKUJĄCYM!

    Po drugie. Programistom, ktorzy uzywaja MacOSX wprowadzasz troche zamieszania. Metoda "cString" klasy NSString jest deprecated, a w iPhone SDK w ogole jej nie ma. Zaleca sie takze stosowanie NSLog zamiast printf..
    Niby masz racje, ale zobacz sobie co produkuje NSLog. W przeciwieństwie do NSlog printf nie drukuje na ekranie nam nie potrzebnych rzeczy i jest przyjanze dla C i oczywiście dla konsoli jeśli chcemy coś zrobić z konsolą więcej niż tylko Logi.
    No i po drugie to nie jest tylko kurs na iPhona a też na Mac OS X, gdzie jest to system Unixwoy i korzysta sie dużo z konsoli, dlatego też printf jest bardzo przydatne.
    No i jeśli chodzi o NSString, to z tego co mi wiadomo to jest ono domyślnie unicode.

    Po trzecie, malo istotne z pozoru. Ale sa ogolne dyrektywy dotyczace konwencji zapisu programu w Obj-C. NIe uzywa sie np. w naglowkach metod takiej ilosci spacji . Zaciemnia to kod i wprowadza zle nawyki. Niby malo istotne ale przy pracy kilku osob nad jednym kodem, potrafi byc cholernie uciazliwe.
    No i znowu. To kto jaki ma styl pisania jest zależne tylko i wyłącznie od programisty. Pamiętaj jeszcze raz to jest pierwsza część i jest ona dla początkujących również. Dlatego też dla czytleności kodu jest tak a nie inaczej. A ja zawsze preferuje taki style:
    Kod php:
    -(void)setName:(NSString *) n andAge:(int) a
    a ten twój:
    Kod php:
    -(void)setName:(NSString *)n wiek:(int)w
    jest mniej zalecane nawet przez te Twoje materiały, które mi kiedyś rzekomo polecałeś.
    Ten pierwszy(mój) jest bardziej czytleny niż ten drugi (twój). I wiadomo co jest robione.

    PAMIĘTAJ SĄ TO POCZĄTKI I MUSI BYĆ PROSTE I ZROZUMIAŁE.
    I JEST TO MOJA METODA PROWADZENIA KURSU.
    Jeśli chcesz zrób po swojemu. Ja mam cel w tym kursie, który obrałem sobie poprzez włąśnie taki a nie inny układ dydaktyczny. Prowadzać poprzez bardzo proste i spójne rzeczy, aż w końcu to tych bardziej zawansowanych.
    No i na samym końcu część kursu pt.: "Poprawny i niepoprawny styl kodowania - sugestie"

    Pozdrawiam.

    PS.
    Jak chcesz, to możesz jeszcze ponarzekać na to iż można settery i gettery tworzyć z automatu bo tak jest w Obejctive C 2.0, no i może jeszcze że nie warto zaczynać nauki od pierwszej jego wersji.
    Ostatnio edytowane przez genshi.wa ; 05.12.2008 o 12:05
    私の名前はSannindanです!
    Watashi no namae wa Sannindandesu!
    www.wymarzonydom.com.pl


  6. Dołączył
    May 2008
    Postów
    177

    Cytuj | #6

    No z polonizacja settera to trochę przesada ale mi to bez różnicy...

    "Przejdziemy teraz do tworzenia obiektów w Objective C oraz ich używania."

    Piszesz takie zdanie, na końcu pierwszej sekcji, a tak naprawdę przechodzisz do tworzenia całej klasy, a dopiero pożniej tworzysz obiekt.

  7. Avatar BilboBaggins
    Dołączył
    Jul 2007
    Skąd
    Częstochowa
    Postów
    397

    Cytuj | #7

    Nie, zebym sie czepial, ale chcialem na cos zwrocic uwage.

    Jesli w ten sposob zakodujesz setter:
    Kod:
    -(void) ustawNazwisko: (NSString *) n
    {
        nazwisko = n;
    }
    to mozesz sie obudzic z reka w nocniku, jesli okaze sie, ze gdzies indziej w kodzie ktos zwolni obiekt przekazany jako parametr. Poza tym nie zwalniasz aktualnego obiektu przechowujacego nazwisko, co moze doprowadzic do wycieku pamieci.
    Generalnie poleca sie cos takiego:
    Kod:
    -(void) ustawNazwisko: (NSString *) n
    {
        [nazwisko release];
        nazwisko = [n retain];
    }
    A juz w ogole idealem byloby tworzenie kopii obiektu podanego jako parametr, ze wzgledu na ewentualna zmiane wartosci, ale to juz wyzsza szkola jazdy, co oczywiscie rozumiem.

    Jak rozumiem konstruktor i destrukor dopiszesz pozniej? Bo zapomniales tu o destruktorze, co tez moze doprowadzic do wycieku pamieci .

    Ostatnia uwaga jest prosta - badz konsekwentny i jak raz w przykladowym kodzie piszesz
    Kod:
    -(typ jaki zwraca metody) metoda;
    to trzymaj sie tego do konca...

    Generalnie to milo sobie przypomniec podstawy i sprawdzic ile sie jeszcze pamieta z poczatkow . Dobrze, ze taka inicjatywa powstala. Szkoda, ze odzew nijaki.
    Komputer: White MacBook 13,3" Mid 2007 Tomek Wójcik Custom
    Telefon: iPhone 8GB + Nokia E51
    Odtwarzacz: iPod Video 5.5G
    MacBook 13,3", Intel Core 2 Duo 2GHz, 4GB RAM (2x2048 MB Corsair), 250 GB HDD (Seagate Momentus), Combo, Mac OS X 10.5.6

    Da sie w MacBook'u podkrecic procesor?


  8. Dołączył
    Jan 2006
    Postów
    63

    Cytuj | #8

    Dlatego wlasnie usunalem to dotyczace konwencji zapisu kodu i sie nie czepiam (odpowiedziales szybciej niz ja to usunalem). Apple zaleca inna, ale to jak juz ktos siadzie do kodowania na OSX bedzie mialo znaczenia.

    Co do "setterow", jest to kluczowe. KeyValue coding jest w kazdym miejscu w OSX. Dlatego ma to takie znaczenie. Dlatego nauka dobrych nawykow jest taka wazna, a nie jak sie komu podoba. Twoj kurs, wiec prowadz jak chcesz.

    BTW w Objective C 2.0 gettery i settery nie tworza sie z automatu Musisz zadeklarowac "property".

    ---- Dodano 05-12-2008 o godzinie 12:25 ----
    Cytat Napisał Optiv Zobacz post
    No z polonizacja settera to trochę przesada ale mi to bez różnicy...
    O i to jest wlasnie przyklad tworzenia zlych nawykow i ignorancji. Odczujesz roznice jak siadziesz i zaczniesz pisac pod OSX.
    Ostatnio edytowane przez Smuggi ; 05.12.2008 o 12:30 Powód: Wpisy zostały automatycznie połączone

  9. Avatar micha_pl
    Dołączył
    Nov 2007
    Skąd
    Łódź
    Postów
    177

    Cytuj | #9

    @BilboBaggins - odzew jest, bardzo mnie to wciągnęło, bo choć jak dotąd nie miałem nic wspólnego z programowaniem to zaczynam sie do tego przymierzać.

    Jak dla mnie świetna robota, jasno i czytelnie. Bardzo dobre przykłady.

    Czekam na następne części .

    Pozdrawiam
    Komputer: MacBook ( late 2008 )
    Telefon: iPhone 3Gs 4.1
    Odtwarzacz: iPod w iPhone

  10. Avatar BilboBaggins
    Dołączył
    Jul 2007
    Skąd
    Częstochowa
    Postów
    397

    Cytat Napisał Smuggi Zobacz post
    Co do "setterow", jest to kluczowe. KeyValue coding jest w kazdym miejscu w OSX. Dlatego ma to takie znaczenie. Dlatego nauka dobrych nawykow jest taka wazna, a nie jak sie komu podoba. Twoj kurs, wiec prowadz jak chcesz.
    Absolutnie sie z kolega zgadzam.
    Dobrze zaimplementowana klasa && Cocoa Bindings == Oszczednosc czasu programisty :).

    Naprawde nie wiem, jak zylem kiedys bez Cocoa Bindings...
    Komputer: White MacBook 13,3" Mid 2007 Tomek Wójcik Custom
    Telefon: iPhone 8GB + Nokia E51
    Odtwarzacz: iPod Video 5.5G
    MacBook 13,3", Intel Core 2 Duo 2GHz, 4GB RAM (2x2048 MB Corsair), 250 GB HDD (Seagate Momentus), Combo, Mac OS X 10.5.6

    Da sie w MacBook'u podkrecic procesor?

Odpowiedz na ten temat
Strona 1 z 12 1 2 3 4 5 11 ... OstatniaOstatnia