1

Тема: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

вже пішов другий тиждень, як я намагаюся допетрати що таке ООП та як його втулити в практику.
перегуглив , перечитав  та перепробував багато. в голові - каша з теорій. теоретично - все зрозуміло, а інкапсуляція навіть приснилася :)

отже - допустимо є таке завдання - написати php-скрипт , який :
- виводить сторінку "по змовчуванню" з можливістю логіну (user  - 'guest')
- в залежності від логіну:
user  - admin - сторінка "по змовчуванню" доповнюється інформацією для адміна
user - root - сторінка "по змовчуванню" доповнюється інформацією для адміна та root-a
- можливість вилогувуватися

з чого почати?
я бачу тут клас - користувач, який може мати три модифікації (гість,адмін, рут)
і ще один  клас - сторінка виводу теж з трьома модифікаціями.

чи вірно?

2

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

Розясни детальніще що значить "доповнюється інформацією для адміна". Якщо виводить 1-2 рядки іншої інфомрації тоді не варто робити багато класів. А якщо логіка роботи досить відрізняється краще тоді розширювати клас сторінки.
А взагалі клас користувача не має мати три модифікації. Клас користувача має тільки статус юзера. Ось приклад коду.

if($user->status==User::STATUS_ADMIN){
 echo 'hi admin';
}else{
 echo 'hi user';
}

p.s. Це так по простому. Надіюсь зрозуміло. Якщо щось питай)

3

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

ООП краще починати лише з інкапсуляції, а потім вже переходити до наслідування та поліморфізму.
Не самий найкращий приклад для використання ОПП. Клас для групи користувачів дійсно не потрібний.

Найкраще зробити 3 класи:
Model (check_user(), get_group())
LoginPage (вхідний клас, який займається логікою. Якщо POST дані не відправлені, то просто йде взаємодія з View (відображення форми входу), якщо відправлені, то ще додатково використовується Model)
View (містить методи, які наприклад відображають шапку, футер та контент)

4

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

funivan написав:

Розясни детальніще що значить "доповнюється інформацією для адміна". Якщо виводить 1-2 рядки іншої інфомрації тоді не варто робити багато класів. А якщо логіка роботи досить відрізняється краще тоді розширювати клас сторінки.

зрозумів.

А взагалі клас користувача не має мати три модифікації. Клас користувача має тільки статус юзера. Ось приклад коду.

if($user->status==User::STATUS_ADMIN){
 echo 'hi admin';
}else{
 echo 'hi user';
}

p.s. Це так по простому. Надіюсь зрозуміло. Якщо щось питай)

$user->status==User::STATUS_ADMIN
якщо властивість status об’єкта user дорівнює статичній властивості класу User значенням STATUS_ADMIN,то ...
так?

5

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

Replace написав:

ООП краще починати лише з інкапсуляції, а потім вже переходити до наслідування та поліморфізму.
Не самий найкращий приклад для використання ОПП. Клас для групи користувачів дійсно не потрібний.

Найкраще зробити 3 класи:
Model (check_user(), get_group())
LoginPage (вхідний клас, який займається логікою. Якщо POST дані не відправлені, то просто йде взаємодія з View (відображення форми входу), якщо відправлені, то ще додатково використовується Model)
View (містить методи, які наприклад відображають шапку, футер та контент)

оце вже MVC вроді... я його на пізніше залишив, бо більшість прикладів по MVC показують на класах, відповідно не посікши нормально класи важко зрозуміти алгоритм MVC.
хоча , знову ж таки - теоретично -  зрозуміло так -  контролер це шнурок між даними/обробкою та відображенням для користувача. і

6

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

MVC - це шаблон проектування. І ти вірно підмітив без початкового знання ооп братись до шаблонів проектування досить важко.
В загальному ооп це парадигма якою користуються для того що б в голові було легко утримувати певну логіку роботи сайту, структуру і тд.
Почни по кроках вивчати відпрості шого до складнішого. Перше зрозумій принципи а потім уже можна на шаблони переходити ;)

$user->status==User::STATUS_ADMIN
якщо властивість status об’єкта user дорівнює статичній властивості класу User значенням STATUS_ADMIN,то ...
так?

Майже вірно.  Тілкьи User::STATUS_ADMIN не статична властивість а константа класу. Це зроблено для того що б читаючи цей код було зрозуміло що це за код. Бо якщо писати ось так:

if($user['status']==1){
echo 'is admin;
}

Буде менш прикольніше :) Так що використання констант є важливою фішкою у підтримці коду ;)

7 Востаннє редагувалося ping (24.09.2012 17:46:57)

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

funivan написав:

MVC - це шаблон проектування. І ти вірно підмітив без початкового знання ооп братись до шаблонів проектування досить важко.
В загальному ооп це парадигма якою користуються для того що б в голові було легко утримувати певну логіку роботи сайту, структуру і тд.
Почни по кроках вивчати відпрості шого до складнішого. Перше зрозумій принципи а потім уже можна на шаблони переходити ;)

$user->status==User::STATUS_ADMIN
якщо властивість status об’єкта user дорівнює статичній властивості класу User значенням STATUS_ADMIN,то ...
так?

Майже вірно.  Тілкьи User::STATUS_ADMIN не статична властивість а константа класу. Це зроблено для того що б читаючи цей код було зрозуміло що це за код. Бо якщо писати ось так:

if($user['status']==1){
echo 'is admin;
}

Буде менш прикольніше :) Так що використання констант є важливою фішкою у підтримці коду ;)

ну ось, вроді написав перший клас:


<?php
class User {
  private $sName;
  private $sEmail;
  private $bLoginstatus;
  private $cType; // [guest| admin | root]
  const STATUS_GUEST='GUEST';
  const STATUS_ADMIN='ADMIN';
  const STATUS_ROOT='ROOT';


  public function __construct() {
    $this->sName='guest';
    $this->sEmail='none';
    $this->cType=User::STATUS_GUEST;
    $this->bLoginstatus=false;
  }
  public function getUser($sName, $sEmail) {
    $this->sName=$sName;
    $this->sEmail=$sEmail;
    $this->bLoginstatus=true;
    switch ($sName) {
      case 'admin':
        $this->cType=User::STATUS_ADMIN;
        break;
      case 'a':
        $this->cType=User::STATUS_ADMIN;
        break;
      case 'r':
        $this->cType=User::STATUS_ROOT;
        break;
      case 'demiurg':
        $this->cType=User::STATUS_ROOT;
        break;
      case 'root':
        $this->cType=User::STATUS_ROOT;
        break;
      default:
        $this->cType=User::STATUS_GUEST;
        break;
    }
  }
  public function putUser($sUser) {
    echo "Current User: <br/>";
    echo 'Status: '.$this->cType.' User Name: '.$this->sName.' E-mail: '. $this->sEmail;
    if ($this->bLoginstatus) {
      echo ' Logged';
    }else {
      echo 'Not logged';
    }
  }
  public function putUserStatus() {
    return $this->cType;
  }
}
if (!isset($oUser)) {
  $oUser=new User;
}
echo $oUser->putUser().'<br/>' ;
if ($oUser->putUserStatus()==User::STATUS_GUEST) {
  echo 'Hi, guest!';
}
else {
  echo 'Hello, mister!';
}

8

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

Хех ) перейдемо до критики.
0 -  включай код в тег код ))
1 - що за назва $sName;  без s ніяк? просто напиши private $name;  З іншими назвами так само)
2 - не доганяю методу getUser. Передаєш імя і мило а отримуєш?? переважно методи які мають приставку get повертають те що іде після get =) Для прикладу getUser має повернути юзера. getStatus - має повернути статус ;)
3. - кашамалаша.

Детально опишу пункт 3.  Тобі треба зрозуміти що має робити клас User. Всіми нами вищевказаний клас User має просто зберігати інфомрацію про юзера і видавати її. Він не має міняти статус при авторизації чи щось таке. Мінятись має інфомрація тільки тоді коли необхідно. Ти мабуть трохи не зрозумів що і куди. Почни з простого. Опиши всі властивості юзера і методи доступу до властивостей.
Дальше зроби клас LoginPage який буде містити інформацію про поточного юзера, буде шукати юзера в базі, і буде виводити повідомлення. Як на мене це оптимальніше ніж все тримати в класі user

9

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

funivan написав:

Хех ) перейдемо до критики.
0 -  включай код в тег код ))

дякую,ніколи не користувався таким тегом :)

1 - що за назва $sName;  без s ніяк? просто напиши private $name;  З іншими назвами так само)

вичитав в  книжці - радили ставити перед змінною її тип.
s-string, c-const, b-boolean, etc.
називаєтьбся типу - угорський стиль кодування - http://en.wikipedia.org/wiki/Hungarian_notation
не знаю- наскільки це прийнято чи доречно...


2 - не доганяю методу getUser. Передаєш імя і мило а отримуєш?? переважно методи які мають приставку get повертають те що іде після get =) Для прикладу getUser має повернути юзера. getStatus - має повернути статус ;)

я тут заплутався . get/put - значення слова розуміємо з боку класу чи з боку того , хто викликає?


3. - кашамалаша.

Детально опишу пункт 3.  Тобі треба зрозуміти що має робити клас User. Всіми нами вищевказаний клас User має просто зберігати інфомрацію про юзера і видавати її. Він не має міняти статус при авторизації чи щось таке. Мінятись має інфомрація тільки тоді коли необхідно. Ти мабуть трохи не зрозумів що і куди. Почни з простого. Опиши всі властивості юзера і методи доступу до властивостей.
Дальше зроби клас LoginPage який буде містити інформацію про поточного юзера, буде шукати юзера в базі, і буде виводити повідомлення. Як на мене це оптимальніше ніж все тримати в класі user

буду довго думати...
але чому об’єкт отримавши зміну якихось властивостей не має поміняти інші?
чисто по аналогії з живим світом - отримавши по пальцю молотком від напарника,  об’єкт "Столяр" не лише міняє властивість пальця (бинтує його ), а й міняє інші властивості - не може тиждень брати в руки важке. також може змінити методи - висловити обурення з приводу невдалого позиціонування молотка напарником.

10

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

Тю, я php майже рік "вчу" а з ООП майже не знайомий.

11

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

funivan написав:

MVC - це шаблон проектування. І ти вірно підмітив без початкового знання ооп братись до шаблонів проектування досить важко.

Ну незнаю, чесно кажучи сам не все розумію в ООП,але допомагаю з одною MVC і все зрозуміло, тим більше навіть вона дещо допомагає зрозуміти ООП.

Але кожному своє=)

12

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

для кінцевого розуміння ооп - фреймворк в руки)
codeigniter подивися на класи, шо там куда, думаєш дальше "вебити" на похапе - yii, simfony

pew pew :D
Блоґ
Подякували: Replace1

13

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

Тепер я кину кілька каменів у ваш город) По-перше, MVC - це архітектура проекту/программи/шаблон проектування і тому подібне. MVC з ООП по своїй суті не пов'язані, MVC можна реалізувати на самих функціях але сам ще не бачив такої штуки. ООП не потрібно намагатися зрозуміти повністю, це просто абстракція котра допомагає програмувати якщо вона затребувана (інколи використання ООП є недоцільним). Якщо хочете краще оволодіти ООП то дивіться в сторону С++, там і множинне спадкування, і поліморфізм самий крутий з усіх що я бачив. (якщо хочете більше про ООП, можете пропустити вивчення вказівників і взагалі усю сішну частину)

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

14

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

Краще вже Java, а не C++

15

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

ООП виник тоді, коли програми стали надто складні для процедурних мов програмування. Тому ваш приклад занадто простий. А ПХП надто простий для застосування повноцінного ООП, бо вся програма працює тільки доки сторінка генерується. Набагато краще для вивчення ООП підходять десктопні програми на Delphi, Java та C#. Там кинув кнопку на форму - от тобі і об'єкт. Можна у його нутрощі заглянути, подивитися: що таке наслідування, поліморфізм.

16

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

А ПХП надто простий для застосування повноцінного ООП

хз я б не кидався такими словами. Я згідний що Java краще розвинена з погляду використання ООП але все ж таки, і на php є обєкти і можна теж зрозуміти що таке наслідування і поліморфізм.
Взагалі як я уже казав краще від простого до складного. І не варто думати що приклад простий.  Сам клас user уже підходить під парадигму OOП сеттери і геттери в ньому є, властивості є. Це має стати головною фішкою з чого треба починати. Бо зразу взяти наслідування класів і думати що звідки і як звязано для початківців думаю важко)

17

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

сеттери і геттери в ньому є, властивості є

ризикую бути закиданим помідорами, но патерн геттерів і сеттерів, не відноситься до парадигми ооп. ооп каже про інкапсуляцію

pew pew :D
Блоґ

18

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

funivan написав:

А ПХП надто простий для застосування повноцінного ООП

хз я б не кидався такими словами. Я згідний що Java краще розвинена з погляду використання ООП але все ж таки, і на php є обєкти і можна теж зрозуміти що таке наслідування і поліморфізм.
Взагалі як я уже казав краще від простого до складного. І не варто думати що приклад простий.  Сам клас user уже підходить під парадигму OOП сеттери і геттери в ньому є, властивості є. Це має стати головною фішкою з чого треба починати. Бо зразу взяти наслідування класів і думати що звідки і як звязано для початківців думаю важко)

Велика перевага Java у вивченні ООП це те, що усе стандартне API Java - велика ієрархія класів, тобто вивчаючи Java ти полюбому будеш жити в ООП. Хоча на php також можна все роздуплитися в ООП. І взагалі, самий більший стереотип про ООП це той який каже що ООП це складно. Пам'ятайте, ООП створювали для полегшення програмування а не для його ускладнення.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

19

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

miroslav.chandler написав:

сеттери і геттери в ньому є, властивості є

ризикую бути закиданим помідорами, но патерн геттерів і сеттерів, не відноситься до парадигми ооп. ооп каже про інкапсуляцію

Сетери і гетери це фішка яка немає ніякого прямого відношення до ООП, можна їх сприймати як щось додаткове до ООП.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

20

Re: ООП: Чи не були б ласкаві гуру на пальцях пояснити ?

Не можливо зрозуміти що таке ООП без розуміння обєкта. Юзер ping написав клас в якому все підряд. Тому я і сказав з чого треба починати. Саме з розуміння обєкта!!!