Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> OOP czy dobrze go stosuję ?
Fanatyko
post
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

Ostrzeżenie: (0%)
-----


Witam, wiem że w tym dziale jest już świeży temat o stosowaniu OOP, jednak chciałbym aby ktoś zweryfikował mój kod czy to co robię jest zgodne z założeniem OOP.

Jest to przykładowy game framework, dla treningu. Mam w nim 4 klasy User, UserManager, Character, CharacterManager, oto one :

  1. <?php class User {
  2.  
  3. function __construct() {
  4.  
  5. }
  6.  
  7. private $_login = null;
  8. private $_password = null;
  9. private $_email = null;
  10. private $_id = null;
  11. private $_logged = null;
  12.  
  13. // tutaj dalej sa standardowe settery i gettery
  14.  
  15. } ?>


  1. <?php
  2. class UserManager {
  3.  
  4. function __construct($user) {
  5. $this->_user = $user;
  6.  
  7. try{
  8. $this->_pdo = new PDO('mysql:host=localhost;dbname=rsfc;', '', '');
  9. $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. }catch(PDOException $error){
  11. echo 'Problem z baza :( :' . $error->getMessage();
  12. }
  13. }
  14.  
  15. private $_user;
  16.  
  17. public function Logon(){
  18.  
  19. $db = $this->_pdo->prepare('SELECT * FROM user_account WHERE login = :login AND password = :password');
  20. $db->execute(array(':login' => $this->_user->getLogin(), ':password' => $this->_user->getPassword()));
  21.  
  22. try{
  23.  
  24. if($user = $db->fetch()){
  25. echo "Zostales zalogowany";
  26. $this->_user->setId($user[id]);
  27. $this->_user->setLogged(1);
  28. $this->_user->setSession();
  29. }
  30.  
  31. else{
  32. throw new Exception("Nie ma Cie w bazie ! Nie zostales zalogowany :(");
  33. }
  34.  
  35. }catch(Exception $error){
  36. echo $error->getMessage();
  37. }
  38.  
  39. }
  40.  
  41.  
  42. }
  43.  
  44. ?>





  1. <?php
  2. class Character {
  3.  
  4. function __construct() {
  5.  
  6. }
  7.  
  8. private $_strenght;
  9. private $_speed;
  10. private $_dynamic;
  11. private $_condition;
  12. private $_pain;
  13. private $_endurance;
  14. private $_iq;
  15. private $_coordination;
  16. private $_technic;
  17. private $_flex;
  18. private $_life;
  19. private $_level;
  20. private $_experince;
  21. private $_needexperince;
  22. private $_money;
  23. private $_reputation;
  24. private $_movepoints;
  25.  
  26. private $_id = null;
  27.  
  28. //settery
  29.  
  30. // tutaj tez standardowe settey i gettery
  31.  
  32.  
  33. }
  34.  
  35. ?>


  1. <?php
  2. class CharacterManager {
  3.  
  4. function __construct($character) {
  5. $this->_character = $character;
  6.  
  7. try{
  8. $this->_pdo = new PDO('mysql:host=localhost;dbname=rsfc;', '', '');
  9. $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. }catch(PDOException $error){
  11. echo 'Problem z baza :( :' . $error->getMessage();
  12. }
  13.  
  14.  
  15. }
  16.  
  17.  
  18.  
  19. private $_character;
  20. private $_pdo;
  21.  
  22. public function render(){
  23. include './views/character.php';
  24. }
  25.  
  26. public function upgradeStatistic($statistic, $how_much){
  27.  
  28.  
  29. $db = $this->_pdo->prepare('UPDATE user_character SET '.$statistic.' = '.$statistic.' + :how_much WHERE id = :id');
  30. $db->execute(array(':how_much' => $how_much, ':id' => $this->_character->getIdFromSession()));
  31.  
  32. }
  33.  
  34. public function downgradeStatistic($statistic, $how_much){
  35.  
  36.  
  37. $db = $this->_pdo->prepare('UPDATE user_character SET '.$statistic.' = '.$statistic.' - :how_much WHERE id = :id');
  38. $db->execute(array(':how_much' => $how_much, ':id' => $this->_character->getIdFromSession()));
  39.  
  40. }
  41.  
  42. public function setStatistics(){
  43. try{
  44.  
  45. $db = $this->_pdo->prepare('SELECT * FROM user_character WHERE id = :id');
  46. $db->execute(array(':id' => $this->_character->getIdFromSession()));
  47.  
  48. if($character = $db->fetch()){
  49. $this->_character->setCondition($character['condition']);
  50. $this->_character->setCoordination($character['coordination']);
  51. $this->_character->setDynamic($character['dynamic']);
  52. $this->_character->setEndurance($character['endurance']);
  53. $this->_character->setExperince($character['experince']);
  54. $this->_character->setFlex($character['flex']);
  55. $this->_character->setIq($character['iq']);
  56. $this->_character->setLevel($character['level']);
  57. $this->_character->setLife($character['life']);
  58. $this->_character->setMoney($character['money']);
  59. $this->_character->setMovePoints($character['move_points']);
  60. $this->_character->setNeedExperince($character['needexperince']);
  61. $this->_character->setPain($character['pain']);
  62. $this->_character->setReputation($character['reputation']);
  63. $this->_character->setSpeed($character['speed']);
  64. $this->_character->setStrenght($character['strenght']);
  65. $this->_character->setTechnic($character['technic']);
  66.  
  67. }else{
  68. throw new Exception('Nie moge uaktualnic statystyk :(');
  69. }
  70. }
  71. catch(Exception $error){
  72. echo 'Wystapil blad:' . $error->getMessage();
  73. }
  74. }
  75.  
  76. }
  77. ?>


Index.php

  1. <?php
  2.  
  3. require 'class/Character.php';
  4. require 'class/CharacterManager.php';
  5. require 'class/User.php';
  6. require 'class/UserManager.php';
  7.  
  8. $User = new User;
  9. $User->setLogin('');
  10. $User->setPassword(md5(''));
  11.  
  12. $UserManager = new UserManager($User);
  13. $UserManager->Logon();
  14.  
  15. try{
  16. if($User->getLogged() == 1){
  17.  
  18. $Character = new Character;
  19. $Character->setIdFromSession();
  20. $CharacterManager = new CharacterManager($Character);
  21. $CharacterManager->upgradeStatistic('strenght', 5);
  22. $CharacterManager->setStatistics();
  23. echo $Character->getStrenght();
  24. }else{
  25. throw new Exception('Nie jestes zalogowany !');
  26. }
  27.  
  28.  
  29. }catch(Exception $error){
  30. echo 'Wystapil blad:'.$error->getMessage();
  31.  
  32. }
  33.  
  34.  
  35.  
  36. ?>



Pytania:

1. Głowne - czy ten kod jest zgodny z OOP ?
2. Czy metoda Logon() powinna być w klasie UserManager czy w osobnej np. Login
3. Czy tworzenie obiektu User a potem przekazywanie go do UserManager w celu obróbki itp jest prawidłowe ? Czy w klasie UserManager powinna być metoda tworząca obiekt User ? (to tyczy się również klas Character i CharacterManager)

Proszę o wytknięcie mi błedów i sposobów w jaki mogę je poprawić (IMG:style_emoticons/default/wink.gif)

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Fanatyko
post
Post #2





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

Ostrzeżenie: (0%)
-----


Cytat
Im mniejsze czyli bardziej rozdrobnione obiekty tym lepszy system. Z drugiej strony jeżeli ma to być prosty system to nie ma sensu sztucznie go komplikować, tak że możesz rejestracje i logowanie zrobić w jednym obiekcie, tylko niech to nie będzie ten sam obiekt który reprezentuje użytkownika. Może 'UserAuthorisation'?


Brakowało mi zamiennika nazwy (IMG:style_emoticons/default/tongue.gif) Dzięki, po raz kolejny.

Cytat
Jeżeli chodzi o sam obiekt Character. Nawrzucałeś do niego różnych zmiennych które ci przyszły do głowy a które nie mają jakiegokolwiek uzasadnienia. Obiekt Character to nie jest prawdziwy obiekt w rozumieniu OOP. Od tablicy różni go tylko forma zapisu.


W którymś tematcie o OOP było napisane, że całkiem rozsądne jest robienie takich kontenerów-obiektów zawierających dane. Są tam zmienne, settery i gettery. Czy jednak to jest zło i należy to zmienić ?

Cytat
Przykładowo $_speed. Czym jest speed? Prędkość z którą porusza się byt w danym momencie czy maksymalna prędkość z którą może się poruszać? Prędkość to jest coś względnego. Względem czego liczysz prędkość? Jeżeli nie masz tego czegoś to może i sama speed powinna na razie zniknąć? Może prędkość nie powinna być zmienną tylko wynikać z relacji obiektów, tak jak w świecie rzeczywistym?


Prawdę mówiąc w kontekście tego co chcę zrobić, nie potrzebuję takich "szerszych horyzontów" bo $_speed ma po prostu być zwykłą statystyką, na której podstawie będzie można wyliczyć np. szanse na unik/trafienie.



To znowu ja (IMG:style_emoticons/default/biggrin.gif)

Zmiany:

Dodałem klasę UserAuthorisation dzięki której po przekezaniu obiektu User można się zalogować.
  1. <?php
  2. class UserAuthoristation {
  3.  
  4. function __construct($user) {
  5. $this->_user = $user;
  6.  
  7. $this->_db = new Database();
  8. $this->_db->connect();
  9. }
  10.  
  11. private $user;
  12.  
  13. public function Logon(){
  14.  
  15. $q = $this->_db->_pdo->prepare('SELECT * FROM user_account WHERE login = :login AND password = :password');
  16. $q->execute(array(':login' => $this->_user->getLogin(), ':password' => $this->_user->getPassword()));
  17.  
  18. try{
  19.  
  20. if($user = $q->fetch()){
  21. echo "Zostales zalogowany";
  22. $this->_user->setId($user[id]);
  23. $this->_user->setLogged(1);
  24. $this->_user->setSession();
  25. }
  26.  
  27. else{
  28. throw new Exception("Nie ma Cie w bazie ! Nie zostales zalogowany :(");
  29. }
  30.  
  31. }catch(Exception $error){
  32. echo $error->getMessage();
  33. }
  34.  
  35. }
  36.  
  37. }
  38. ?>
  39.  


Dodałem klase Database do obsługi bazy danych, za wiele w niej nie ma (IMG:style_emoticons/default/smile.gif)

  1.  
  2. class Database {
  3.  
  4. function __construct() {
  5.  
  6. }
  7.  
  8. public function connect(){
  9. try{
  10. $this->_pdo = new PDO('mysql:host=localhost;dbname=;', '', '');
  11. $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  12. }catch(PDOException $error){
  13. echo 'Problem z baza :( :' . $error->getMessage();
  14. }
  15. }
  16.  
  17. }
  18.  
  19.  


Zmiany w klasie UserManager, dodałem funkcję tworzącą użytkownika, wywalilem z niej funkcje logującą i dodałem wykorzystanie klasy Database.
  1. class UserManager {
  2.  
  3. function __construct($user) {
  4. $this->_user = $user;
  5. $this->_db = new Database;
  6. $this->_db->connect();
  7. }
  8.  
  9. private $_user;
  10.  
  11. public function create(){
  12. $q = $this->_db->_pdo->prepare('INSERT INTO user_account VALUES(null,:login,:nick,:password,:email)');
  13. $q->execute(array(':login' => $this->_user->getLogin(), ':password' => $this->_user->getPassword(), ':nick' => 'test', 'email' => 'test'));
  14.  
  15. return "User zostal stworzony";
  16. }
  17.  
  18.  
  19. }
  20.  


W index.php dorzuciłem tworzenie usera.

  1.  
  2. <?php
  3.  
  4. require 'class/Character.php';
  5. require 'class/CharacterManager.php';
  6. require 'class/User.php';
  7. require 'class/UserManager.php';
  8. require 'class/Database.php';
  9. require 'class/UserAuthorisation.php';
  10.  
  11. //logowanie
  12.  
  13. $User = new User;
  14. $User->setLogin('Fanatyko');
  15. $User->setPassword(md5('beniamins9'));
  16.  
  17. $UserAuthorisation = new UserAuthoristation($User);
  18. $UserAuthorisation->Logon();
  19.  
  20. // zwiekszanie statystyk jesli jest sie zalogowanym
  21. try{
  22. if($User->getLogged() == 1){
  23.  
  24. $Character = new Character;
  25. $Character->setIdFromSession();
  26. $CharacterManager = new CharacterManager($Character);
  27. $CharacterManager->upgradeStatistic('strenght', 5);
  28. $CharacterManager->setStatistics();
  29. echo $Character->getStrenght();
  30. }else{
  31. throw new Exception('Nie jestes zalogowany !');
  32. }
  33.  
  34.  
  35. }catch(Exception $error){
  36. echo 'Wystapil blad:'.$error->getMessage();
  37.  
  38. }
  39.  
  40. //tworzenie nowego usera
  41.  
  42. $User2 = new User;
  43. $User2->setLogin('Test');
  44. $User2->setPassword(md5('test'));
  45.  
  46. $UserManager2 = new UserManager($User2);
  47. $UserManager2->create();
  48.  
  49.  
  50. ?>


Jest dobrze ?

Ten post edytował Fanatyko 29.08.2011, 21:48:05
Go to the top of the page
+Quote Post

Posty w temacie
- Fanatyko   OOP czy dobrze go stosuję ?   27.08.2011, 20:16:00
- - smentek   Cytat1. Głowne - czy ten kod jest zgodny z OOP ? ...   27.08.2011, 21:23:05
- - Fanatyko   No właśnie też złapałem się na tym, że rzucam nazw...   28.08.2011, 06:10:21
- - rahul   mysle ze mozesz sobie poczytac moj post, zadawalem...   28.08.2011, 09:32:09
- - elektrrrus   Prawdopodobnie całkiem przez przypadek, ale zrobił...   28.08.2011, 09:46:31
- - Spawnm   Za łączenie z pdo powinna odpowiadać klasa db a ni...   28.08.2011, 09:51:15
- - smentek   CytatPrawdę mówiąc nie wiem czy złapałem o co chod...   28.08.2011, 10:01:51
- - Fanatyko   Cytatmysle ze mozesz sobie poczytac moj post, zada...   28.08.2011, 11:47:00
- - melkorm   jeżeli masz dane w tablicy o takich samych nazwach...   28.08.2011, 12:04:58
- - smentek   CytatZakładając, że chcę napisać klasę do logowani...   28.08.2011, 12:42:34
- - Fanatyko   CytatIm mniejsze czyli bardziej rozdrobnione obiek...   29.08.2011, 19:31:13
- - Fantazyn   Dla mnie kod wygląda całkiem znośnie, ale: 1. Unik...   29.08.2011, 20:12:22
- - banditpanda   class Database { function __construct() ...   29.08.2011, 20:16:28
- - Fanatyko   @Fantazyn dzięki za odpowiedź, naprawdę mi się pr...   29.08.2011, 21:52:58
- - smentek   Cytat"W którymś tematcie o OOP było napisane,...   30.08.2011, 20:30:25
- - Fanatyko   CytatI to jest złe stosowanie get i set. Jezeli wp...   30.08.2011, 21:11:51
- - daren88   Główny problem tej klasy na co już niektórzy zwróc...   3.09.2011, 21:20:21
- - CuteOne   Mi nie podoba się jedna rzecz... zrobiłeś z klasy ...   4.09.2011, 12:22:55


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 12:17