Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Верна ли грамматика ООП
maximka787  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1258
Пользователь №: 2705
На форуме: 9 лет, 11 месяцев, 17 дней
Карма: 1




Парни, решил по полной переучиваться на ООП. Написал класс. Посмотрите, есть ли в нем грубые ошибки и верно ли в целом логика. А то недавно делал класс по БД и понял, что не с того начал :)

Вот вопросы:

1) Нет ли грамматических или логических ошибок.

2) Чем это удобней функций? Прикольно конечно наполнять объект, не задумываясь о том, как там оно внутри. Но я так подозреваю, не в этом фишка ООП. Либо у меня слишком детский класс.

3) Метод generateContent() генерирует html код. Говорят что это лучше не делать в классах, но я не понимаю, как тогда проще генерировать. Не в самом же скрипте его собирать.

4) Можно ли использовать переменные внутри методов, без $this. Как в том же моём generateContent().

class Film
{
private $name;
private $director;
private $actors = array();
private $actors_count;

public function __construct($name)
{
$this->name = $name;
}

public function setDirector($name)
{
$this->director = $name;
}

public function editName($name)
{
if(!empty($name))
{
$this->name = $name;
}
}


public function addActor($name)
{
$this->actors[] = $name;

$this->actors = array_unique($this->actors);

$this->countActor();
}

public function delActor($name)
{
if(($key = array_search($name, $this->actors)) !== false)
{
unset($this->actors[$key]);

$this->countActor();
}
}


private function countActor()
{
$this->actors_count = count($this->actors);
}

private function generateFilename($len = 10)
{
$charset = "abcdefghijklmnopqrstuvwxyz";
$name = '';
$count = strlen($charset);
while($len--)
{
$name .= $charset[mt_rand(0, $count-1)];
}
return $name.'.txt';
}

private function generateContent()
{
$html = '<p>Название фильма: '.$this->name.'</p>';
$html .= '<p>Режиссер: '.$this->director.'</p>';
if($this->actors_count > 0)
{
$html .= '<p>Актерский состав: '.implode(", ", $this->actors).'</p>';
}

return $html;
}

public function saveToFile($filename = '')
{
if(empty($filename))
{
$filename = $this->generateFilename();
}

if(file_put_contents($filename, $this->generateContent()))
{
return 'Файл сохранен';
}
else
{
return 'Ошибка сохранения файла';
}
}
}



$f = new Film('Терминатор 2');

$f->setDirector('Джеймс Кэмерон');

$f->addActor('Арнольд Шварценеггер');
$f->addActor('Майкл Бин');
$f->addActor('Линда Хэмилтон');
$f->addActor('Линда Хэмилтон'); //test copy

$f->delActor('Майкл Бин'); //Ради теста :)

echo $f->saveToFile();


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Michael  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6095
Пользователь №: 18498
На форуме: 7 лет, 11 месяцев, 29 дней
Карма: 256




Цитата (maximka787)
или логических ошибок.

Подсчет актеров тебе не нужен, всегда с массива actors можно взять count
Цитата (maximka787)

4) Можно ли использовать переменные внутри методов

Конечно можно.

Ну и в общем, у тебя неправильно все сделано, ООП это о SOLID, наугад тут лучше не делать. Твой класс надо на 3 разбивать. Плюс что это за текстовые возвращаемые статусы в saveToFile, про исключения слышал?


--------------------
There never was a struggle in the soul of a good man that was not hard
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Another Reality  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 215
Пользователь №: 41606
На форуме: 2 года, 9 дней
Карма: 7




Нужно прочитать про SOLID Тогда часть вопросов отпадет.

К чему это я?
Цитата
3) Метод generateContent() генерирует html код. Говорят что это лучше не делать в классах, но я не понимаю, как тогда проще генерировать. Не в самом же скрипте его собирать.

И правильно говорят! А все потому, что завтра тебе понадобится как-то иначе вывести эти данные, или добавить к ним еще какую-то информацию из другого источника, да мало ли, что еще может быть. Объект может возвращать нужные данные, но никаких выводов на экран и подобного быть не должно. Для этого делается другая конструкция, чья работа - "генерить html".
То же самое с методом saveToFile(). Напиши отдельный класс, который будет заниматься сохранением данных в файлы и передавай туда нужную информацию. К тому же в таком случае, этот класс может именть несколько различных методов сохранения/чтения и так далее.

This - это ссылка внутри объекта на самого себя. Экземпляров класса может сколько угодно, конструкция this говорит интерпретатору, что данная переменная относится конкретно к этому объекту. Чтобы было понятнее прочитай о статических полях, которые являются общими для всех экземпляров класса, для них "this" не надо.
К переменным, которые созданы внутри конкретного метода обращение происходит просто по имени, без this.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maximka787  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1258
Пользователь №: 2705
На форуме: 9 лет, 11 месяцев, 17 дней
Карма: 1




Цитата (Michael @ 10.02.2017 - 12:14)
Цитата (maximka787)
или логических ошибок.

Подсчет актеров тебе не нужен, всегда с массива actors можно взять count
Цитата (maximka787)

4) Можно ли использовать переменные внутри методов

Конечно можно.

Ну и в общем, у тебя неправильно все сделано, ООП это о SOLID, наугад тут лучше не делать. Твой класс надо на 3 разбивать. Плюс что это за текстовые возвращаемые статусы в saveToFile, про исключения слышал?

Это просто пример. Например мне надо сохранить всё в файл, вот я и написал функцию. Про solid я згал и ранее. Я пишу функции и всегда стараюсь сделать так, чтоб одно от другого не зависело. В том же вордпрессе очень много функций и каждая выдает нужные данные, и этими данными легко дальше оперировать.
Про исключения не слышал. А что это? Щас сам еще поищу.


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maximka787  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1258
Пользователь №: 2705
На форуме: 9 лет, 11 месяцев, 17 дней
Карма: 1




Цитата (Another Reality @ 10.02.2017 - 12:15)

И правильно говорят! А все потому, что завтра тебе понадобится как-то иначе вывести эти данные, или добавить к ним еще какую-то информацию из другого источника, да мало ли, что еще может быть. Объект может возвращать нужные данные, но никаких выводов на экран и подобного быть не должно. Для этого делается другая конструкция, чья работа - "генерить html".
То же самое с методом saveToFile(). Напиши отдельный класс, который будет заниматься сохранением данных в файлы и передавай туда нужную информацию. К тому же в таком случае, этот класс может именть несколько различных методов сохранения/чтения и так далее. 

Я понял, лучше разделить класс на 3 класса. Первый это фильмы второй класс сохранения всего что угодно, да? А третий класс вывода. Который уже сам выводит html. Я верно понял?

Почему я вывожу в функции иои классе? Тут все просто. Есть какой то участок в коде в котором собирается контент. Мне например выделяют какую то функцию одну. И в ней я уже мучу все что хочу результатом которого один return.
Главный кодер пишет recure_once и делает Shtml .= func();
А я уже внутри этой функции сам работаю.


--------------------
..Работает - не трогай!
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Another Reality  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 215
Пользователь №: 41606
На форуме: 2 года, 9 дней
Карма: 7




Цитата (maximka787 @ 10.02.2017 - 18:49)
Я понял, лучше разделить класс на 3 класса. Первый это фильмы второй класс сохранения всего что угодно, да? А третий класс вывода. Который уже сам выводит html. Я верно понял?
Да, все верно.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 823
Пользователь №: 36058
На форуме: 4 года, 6 месяцев, 28 дней
Карма: 42




Цитата (maximka787 @ 10.02.2017 - 15:41)
Парни, решил по полной переучиваться на ООП. ... А то недавно делал класс по БД и понял, что не с того начал smile.gif

И продолжил тоже. wink.gif

Тебе нужно понимание.
Начни с понимания, что код это просто отражение твоего понимания ООП.
Затем научись мыслить категориями объектов.
И начни с понимания того, что всё в нашем мире объекты. Объекты имеют параметры (свойства) и действия (методы).
Закончи тем, что ПХП это не полный объектный язык, а заметно ограниченный. С этим пониманием его и используй.

Так вот, пока ты не научишься мыслить объектами, ты не сможешь написать правильный код.
Рекомендую, - пока не станешь мастером ООП, используй только классику, никакого шаманства. Это поспособствует правильному коду.
А то, что злые дядьки тут советуют сделать (разделить на три, твёрдый, html и пр.) это полная фигня. К ООП это не имеет никакого отношения.
В частности, твой класс, что в начале темы, почти правильный в плане идеи ООП, но в стилистике кода, особенно с учётом ПХП, плохой. Уверен, ты сделаешь его правильным, если представишь себе, что фильм это объект, который имеет свойства и методы. Также, список актёров, это тоже объект, режиссёр это тоже объект и т.п.

п.с. Когда сделаешь - покажешь. Тогда может ещё чего умного скажу, уже более конкретно.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16116
Пользователь №: 6543
На форуме: 8 лет, 9 месяцев, 22 дня
Карма: 304

Трезвый :
6 лет, 7 месяцев, 1 день


Почему когда тема касается ООП, всегда столько пафоса... "Научись мыслить объектами; придет понимание, что всё в мире - объекты; параметры, свойства, методы..." и всякая другая хрень.

Я до сих пор не научился мыслить объектами. Потому что это лишнее звено. Сначала научишься, потом придется переучиваться.

Все дело в том, что компьютер в первую очередь придуман решать именно виртуальные задачи. И только как сопутствующие - материальные. Другими словами, не так часто приходится создавать подобные реальным объекты. Собаки, машины, фильмы, режисеры... Ну может в игрушках каких. Гораздо чаще приходится автоматизировать то, чего в материальном мире нет. Статистика, отчеты, заказы и т.д. Не в их бумажном отображении, а именно как субстанцию, как сущность.

Так что я не советую учиться мыслить объектами. Начинать как раз лучше изнутри, с технической стороны. Тогда голова не будет забита всякой ересью, как представить объектами то, что объективного представления не имеет, а главное как это всё соорганизовать. Постепенно оно само соорганизуется.

А в этом
Цитата (S.Chushkin @ 11.02.2017 - 05:47)
А то, что злые дядьки тут советуют сделать (разделить на три, твёрдый, html и пр.) это полная фигня. К ООП это не имеет никакого отношения.
я полностью согласен. Вообще всё ООП, это большой, красивый мыльный пузырь. И SOLID - попытка сделать его немного тверже и осязаемей. На самом деле, если разобраться досконально, то и в нем далеко не все гладко. smile.gif




--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 823
Пользователь №: 36058
На форуме: 4 года, 6 месяцев, 28 дней
Карма: 42




Цитата (twin @ 11.02.2017 - 11:09)
Так что я не советую учиться мыслить объектами.

Если Человеку нужно ООП (неважно по какой причине, сам решил или начальство заставило или ещё что), то без понимания, что "всё объекты" и т.д. ему не обойтись. Конечно, если он хочет стать Спецом, а не чёрте чем и сбоку бантик.


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Michael  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6095
Пользователь №: 18498
На форуме: 7 лет, 11 месяцев, 29 дней
Карма: 256




Цитата (S.Chushkin @ 11.02.2017 - 09:24)
то без понимания, что "всё объекты" и т.д. ему не обойтись. Конечно, если он хочет стать Спецом, а не чёрте чем и сбоку бантик.

"все объекты", это просто способ ничего не сказать.
Окей, все у нас объекты теперь, чем это помогло в проектировании?
А вот первый принцип SOLID, которого ты не понимаешь, вещь очень важная, и раз ты его отрицаешь, то до этого момента ты и не писал ООП кода, да были у тебя классы и объекты, но это был не ООП (OOAD по английски - Объектно ориентированный анализ и проектирование)


--------------------
There never was a struggle in the soul of a good man that was not hard
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16116
Пользователь №: 6543
На форуме: 8 лет, 9 месяцев, 22 дня
Карма: 304

Трезвый :
6 лет, 7 месяцев, 1 день


Цитата (S.Chushkin @ 11.02.2017 - 07:24)
без понимания, что "всё объекты" и т.д. ему не обойтись. Конечно, если он хочет стать Спецом, а не чёрте чем и сбоку бантик.

Еще больше пафоса... И еще меньше конкретики. Какая то мантра.

Ну я настаивать не буду. Всё объекты, так всё. Это философия в конце концов, к программированию мало имеющая отношения. Понимание процессов тут важнее философии. А с какой стороны придти к этому, через объекты или субъекты, дело десятое. smile.gif




--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16116
Пользователь №: 6543
На форуме: 8 лет, 9 месяцев, 22 дня
Карма: 304

Трезвый :
6 лет, 7 месяцев, 1 день


Цитата (Michael @ 11.02.2017 - 07:33)
А вот первый принцип SOLID, которого ты не понимаешь, вещь очень важная,
Его, как и весь SOLID, вообще мало кто понимает. Его просто принимают как должное. Хотя если именно понять, то можно извлечь некоторую пользу. Потому что следование принципам, равно как и их нарушение, должно быть осознанным.

Допустим тот же SRP. Его нельзя интерпретировать как правило. Ибо определение весьма размыто. Объект должен иметь одну ответственность. Это понятно. А как определить эту ответственность? Если это нож, он должен уметь резать. Если штопор - открывать бутылки. А ели это складной нож? Он еще может уметь откручивать болты, а иногда пилить дерево и вытаскивать гильзы из ружья. Но если фанатично следовать SRP, то нужно тащить все по отдельности, и еще кухонный гарнитур впридачу. smile.gif

А размытые, неконкретные формулировки не приводят к пониманию процессов. Они больше путают. Я бы формулировал этот принцип от обратного. От антипаттерна. "Старайтесь по возможности избегать God-objects в своем коде."

Именно по возможности. И тогда это хорошая рекомендация, принцип, а не жесткое правило, как многие считают и представляют себе принципы SOLID. Особенно после прочтения безапелляционных формулировок.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 16116
Пользователь №: 6543
На форуме: 8 лет, 9 месяцев, 22 дня
Карма: 304

Трезвый :
6 лет, 7 месяцев, 1 день


Вот у ТС классический God-object. Но однако если ему больше никакой функционал не нужен, если это весь сайт, на кой нужно что делить, пилить, еще DIC какой-нибудь насоветуйте... Он должен сам понять, когда от этой дележки есть профит. А не потому, что дядя Боб там насоветовал. Снаружи понять это трудно. Особенно когда голова забита дурью "всё-объект".

Он же учится, а не проектирует кинотеатр. Учится нужно помаленьку.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Another Reality  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 215
Пользователь №: 41606
На форуме: 2 года, 9 дней
Карма: 7




twin, в общем, ты говоришь все верно. Но, вопросы ТС были вполне локаничны и недвусмысленны, как следствие - ответы такие же.

А для того, чтобы человек смог сознательно нарушать какие-то принципы, выходить за границы правил, для начала стоит в них разобраться, в причинах появления этих правил и принципов.
Ну не может человек, у которого нет четкого понимая "this", размышлять как ты со своим *адцатилетним опытом, о том, что SOLID - не панацея и можно нарушать, если имеет смысл.

Человек только на начальном пути, пусть все идет своим чередом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
chee  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Сын полка
Сообщений: 1974
Пользователь №: 38654
На форуме: 3 года, 6 месяцев, 22 дня
Карма: 46




Цитата (maximka787 @ 10.02.2017 - 15:41)
2) Чем это удобней функций?


Тем что ООП позволяет подменять поведение без переписывания существующего кода.


Цитата (maximka787 @ 10.02.2017 - 15:41)
Метод generateContent() генерирует html код. Говорят что это лучше не делать в классах, но я не понимаю, как тогда проще генерировать. Не в самом же скрипте его собирать.

В методе класса выбираешь только данные для отображения. Потом проксируешь эти данные в какой-нибудь шаблонизатор.


--------------------
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации

Мой блог
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса