Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: OOP -> czy idę w dobrym kierunku
Forum PHP.pl > Forum > PHP > Object-oriented programming
PawelC
Bawię się cały czas OOP, ponieważ nudzi mnie używanie gotowych frameworków, a tak to przynajmniej się człowiek czegoś nauczy. I mam pytanie, czy idę w dobrym kierunku w OOP, dla przykładu podaje próbkę działającego kodu:
  1. <?php
  2. class content
  3. {
  4.    
  5.    public function getContent()
  6.    {
  7.        $tablica=file('tekst.txt');
  8.        foreach($tablica as $key)
  9.        {
  10.            $zdania[]=$key;
  11.        }
  12.        return $this->zdania=$zdania;
  13.    }
  14.    
  15.    
  16.    public function shuffle()
  17.    {
  18.        shuffle($this->zdania);
  19.        $wylosowane=$this->zdania;
  20.        return $this->wylosowane=$wylosowane[0];
  21.    }
  22.    
  23.    public function view()
  24.    {
  25.        return '<h1>'.$this->wylosowane.'<h1>';
  26.    }
  27. }
  28. $new=new content;
  29. $new->getContent();
  30. $new->shuffle();
  31. echo $new->view();
  32. ?>

Ta klasa ma za zadanie wylosowanie jednego zdania, spośród 3tys zdań i wywalenie go na ekran w tagu h1
gcdreak
Twój kod nie jest zły, ale ja bym to zrobił mniej więcej tak:
Kod
            class content
             {
                
                public $zdania;
                public $tablica;
                public $wylosowane;
                
                public function __construct($file){
                    $this->tablica = file($file);    
                }
                
                public function getContent(){
                    foreach($this->tablica as $key)
                    {
                        $zdania[] = $key;
                    }
                    return $this->zdania = $zdania;
                }
                
                
                public function shuffle(){
                    shuffle($this->zdania);
                    $wylosowane = $this->zdania;
                    return $this->wylosowane = $wylosowane[0];
                }
                
                public function view(){
                       $this->getContent();
                       $this->shuffle();
                    return '<h1>'.$this->wylosowane.'<h1>';
                }
             }
             $new=new content('words.txt');
             echo $new->view();


Ponad to można by jeszcze wczytać zawartośc pliku do zmiennej i potem za pomocą explode() podzielić to na zdania winksmiley.jpg

Zrobiłem mały przykład (tak na szybko dlatego nazwy atrybutów są trochę pomieszane):
Kod
            class content
            {
              
               public $zdania;
               public $tablica;
               public $wylosowane;
              
               public function __construct($file){
                    $this->tablica = file_get_contents($file);
               }
              
               public function getContent(){
                  
               }
              
               public function explode(){
                       $zdania = explode('. ', $this->tablica);
                    return $this->zdania = $zdania;
               }
              
               public function shuffle(){
                   shuffle($this->zdania);
                   $wylosowane = $this->zdania;
                   return $this->wylosowane = $wylosowane[0];
               }
              
              
               public function view(){
                   $this->explode();
                      $this->shuffle();
                   return '<h1>'.$this->wylosowane.'<h1>';
               }
            }
            $new=new content('words.txt');
            echo $new->view();
PawelC
Cytat
Twój kod nie jest zły, ale ja bym to zrobił mniej więcej tak:

Co programista to inny styl programowania biggrin.gif
Cytat
Ponad to można by jeszcze wczytać zawartośc pliku do zmiennej i potem za pomocą explode() podzielić to na zdania

Też tak chciałem zrobić, ale zrezygnowałem z tego sposobu.

W tym kodzie co napisałeś public function getContent(), w ogóle nie jest potrzebne bo tego nie użyłeś, ale z tym explode ciekawe rozwiązanie.
dr_bonzo
  1. <?php
  2. public function view(){
  3.                   $this->explode();
  4.                      $this->shuffle();
  5.                   return '<h1>'.$this->wylosowane.'<h1>';
  6.               }
  7. [/php
  8. Bez sensu co chwile robic explode przy kazdym wyciaganiu zdania, szczegolnie jestli zdania sa w pliku wrzucone tak ze kazde zdanie w osobnej linijce.
  9.  
  10. Po co metoda view()? nie prosciej pobrac wylosowane zdanie i DOWOLNIE potem je wyswietlic a nie tylko w <h1>?
  11.  
  12. [php]
  13. public function shuffle(){
  14.                   shuffle($this->zdania);
  15.                   $wylosowane = $this->zdania;
  16.                   return $this->wylosowane = $wylosowane[0];
  17.               }
  18.              
  19.              
  20.               public function view(){
  21.                   $this->explode();
  22.                      $this->shuffle();
  23.                   return '<h1>'.$this->wylosowane.'<h1>';
  24.               }
  25. ?>

Kod tutaj jest conajmniej zagmatwany i nieczytelny.
Nie prosciej zrobic mieszanie zdan zaraz po zaladowaniu, a potem pobierac nastepne z tablicy?
Crozin
A ja polecam rozpoczęcie zabawy z czymkolwiek od włączenia raportowania wszystkich błędów - masz trochę złych praktyk.

content::getContent - zmień nazwę tej metody. Tak się już przyjęło, że metody na get/set pełnią rolę getterów i setterów i wyłącznie dla czytelności, przejrzystości, a przede wszystkim łopato-logiczności* kodu dobrze jest się trzymać takich zasad.

Zero jakiekolwiek możliwości konfiguracji. Dane muszą być ładowane z jednego określonego pliku, wyświetlane są w jeden sposób.

Pozatym... tutaj to takie OOP na siłe:
  1. <?php
  2. $data = file('plik'); $result = $data[array_rand($data)];
  3. echo sprintf('<h1>%s</h1>', $data);
  4. ?>
Tak więc, proponowałbym jakieś nieco bardziej zaawansowane rzeczy robić.

* - ponoć to się z "-" pisze wg Opery smile.gif
PawelC
Cytat(Crozin)
Tak więc, proponowałbym jakieś nieco bardziej zaawansowane rzeczy robić.

Jakie rzeczy masz na myśli? Z chęcią zrobiłbym coś trudniejszego, zawsze to idzie się nowych rzeczy nauczyć.
Cytat(Crozin)
A ja polecam rozpoczęcie zabawy z czymkolwiek od włączenia raportowania wszystkich błędów - masz trochę złych praktyk.

Np. jakie, fakt faktem wyświetlanie błędów mogę zrobić przy pomocy Exceptions
Crozin
Chodziło mi o raportowanie błędów zgłaszanych przez interpreter PHP. A jakie masz te brzydkie praktyki? A np.:
  1. <?php
  2. foreach($this->tablica as $key)
  3.                    {
  4.                        $zdania[] = $key;
  5.                    }
  6. ?>
A gdzie definicja, że $zdania to tablica?

Poza tym (pisałem to już chyba Tobie) nie mieszaj polskiego i angielskiego.
PawelC
Cytat(Crozin)
A gdzie definicja, że $zdania to tablica?

Masz na myśli coś takiego:
  1. <?php
  2. public $zdania=array[];
  3. ?>

Cytat(Crozin)
Poza tym (pisałem to już chyba Tobie) nie mieszaj polskiego i angielskiego.

Tak pisałeś, muszę to zmienić i używać angielskiego.
Cytat(Crozin)
Chodziło mi o raportowanie błędów zgłaszanych przez interpreter PHP.

Czyli zamiast
  1. <?php
  2. echo "Wystąpił błąd";
  3. ?>

Robić:
  1. <?php
  2. throw new Exception('Wystąpił błąd');
  3. ?>

O tym mowa?
piotrooo89
Exceptions to klasa wyjątków nie błędów. błędu to TU
Crozin
Raportowanie błędów to: http://nospor.pl/php-faq-n29.html#faq-2 (dodaj sobie jeszcze E_STRICT bo to jest wyłączone spod E_ALL).

Mam na myśli:
  1. <?php
  2. $zadani = array()
  3. ?>
PawelC
Cytat(piotrooo89 @ 21.06.2009, 16:18:37 ) *
Exceptions to klasa wyjątków nie błędów. błędu to TU

No to teraz wiem o co chodzi biggrin.gif
Cytat(Crozin @ 21.06.2009, 16:23:13 ) *
Raportowanie błędów to: http://nospor.pl/php-faq-n29.html#faq-2 (dodaj sobie jeszcze E_STRICT bo to jest wyłączone spod E_ALL).

Mam na myśli:
  1. <?php
  2. $zadani = array()
  3. ?>

Ok dzięki za info smile.gif
Oprócz tego, jeszcze widzisz jakieś moje złe nawyki?
gcdreak
Pytałeś o bardziej zaawansowane rzeczy.
Wczoraj wpadłem na pomysł, żeby zrobić klasę FiguryGeometryczne, która będzie wykorzystywać GD library.
Niestety jakoś tak zająłem się czym innym.
Jeśli Ci się chcę i masz trochę czasu to możesz stworzyć coś takiego i podzielić się kodem, oczywiście winksmiley.jpg
PawelC
Cytat(gcdreak @ 21.06.2009, 19:11:06 ) *
[...]
Jeśli Ci się chcę i masz trochę czasu to możesz stworzyć coś takiego i podzielić się kodem, oczywiście winksmiley.jpg

To dla mnie raczej nie wykonalne w OOP.
mike
Cytat(ExPlOiT @ 21.06.2009, 21:36:25 ) *
To dla mnie raczej nie wykonalne w OOP.
LOL A to niby dlaczego?
PawelC
Cytat(mike @ 21.06.2009, 21:39:55 ) *
LOL A to niby dlaczego?

Myślę, że dlatego, że w OOP nie jestem biegły, i znam jedynie podstawy co widać po kodzie który jest w pierwszym poście, choć z dnia na dzień coraz więcej się uczę, bo dużo trenuje pisząc różne klasy w OOP.
Chociaż nie powiem, zawsze można spróbować, przynajmniej w trakcie tworzenia tej klasy, nauczę się nowych rzeczy, które, być może przydadzą się w przyszłości.

Mój tryb nauczania wygląda tak że np. wymyślę sobie jakiś serwis, np ogłoszenia i piszę całe oskryptowanie w OOP od zera, dzięki czemu według mnie utrwalam sobie zdobytą wiedzę, i uczę się nowych rzeczy. Podobno najlepiej uczyć się programować obiektowo, pisząc trudniejsze i bardziej skomplikowane rzeczy. Jeżeli nie mam pomysłu na serwis, to rozbudowuje sobie, wcześniej napisane klasy, lub tworze nowe które mają jakiś konkretny cel i zadanie.
PawelC
A czy ktoś ci każe, tłumaczyć mi wszystko od zera? Napisałem gdzieś coś takiego? Po za tym jak nie masz nic mądrego do powiedzenia w temacie, to lepiej milcz, zamiast pisać bez sensowne posty.

A Ty jak zaczynałeś programować, to od razu byłeś super programistą wiedzący wszystko bez jakiejkolwiek pomocy?

#Widzę że nawet posta wykasowałeś
PawelC
Cytat(belliash @ 21.06.2009, 23:28:33 ) *
ja nie zadawalem tak prostackich pytan na forum ... od tego sa ksiazki i uczenie sie na cudzym kodzie ktory mozesz przeanalizowac...

I to według Ciebie jest powód, żeby każdego od razu zmieszać z błotem?

belliash brawo drugi post wykasowałeś, oby tak dalej. Nie piszę kolejnego posta bo kolejnego wykasujesz, książkę mam ale niema w niej zbyt wiele informacji, dokładnie ta http://helion.pl/ksiazki/probph.htm

I widzę że już 3 posta wykasowałeś, tego w którym odpowiadałeś na ten w którym piszę.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.