Public and Private members in PHP classes

  • Автор темы webdeveloper
  • Дата начала

webdeveloper

Guest
Public and Private members in PHP classes

Вот задумался я над таким вопростом.

Вот допустим есть у меня класс Search
Там есть поля $currentPage, $pageSize, $searchString и т.д.

Имеет ли смысл писать специальные методы для установки этих значений?

То есть сейчас я пишу
PHP:
$search = new Search();
$search->setCurrentPage(10);
$search->setPageSize(20);
$search->setLogic("ALL");
$search->setSearchString("Find something");
$items = $search->doSearch();
unset($search);
Да вот только для всех этих методов, которые устанавливают значения требуется место и они достаточно сильно увеличивают размер файла. Может быть лучше будет написать просто что то типа вот этого?

PHP:
$search = new Search();
$search->CurrentPage = 10;
$search->PageSize = 20;
$search->Logic = "ALL";
$search->SearchString = "Find something";
$items = $search->doSearch();
unset($search);
Какие будут мнения?
 

SeazoN

Guest
Если эти методы ничем другим не занимаются, кроме присваивания - то зачем они вообще нужны? Наверняка они-таки делают обработку данных. Мало- ли чего ты понавводишь...
 

Eugene Bond

sudo rm - rf /
Это одна из первооснов ООП. Инкапсуляция называется.

А если тебе жалко размера файла, то короче будет:

doSearch(10, 20, "ALL", "Find something")
 

[VS]

Guest
webdeveloper:
сядь и 10 минут подумай - возможны ли другие реализации этого класса, где
а) эти данные не будут храниться в виде переменных
или
б) при изменении/установки этих данных нужно еще что-то дополнительное делать
или
с) возникнет ошибка, если в процессе работы эти данные кто-то извне изменит

если один из этих трех пунктов выполнится, то делай функции.

Если ты уверен что ни один из этих пунктов не выполнится (обычный случай для простых классов с короткой жизнью и которые не нужны нигде кроме одного особенного проэкта) - то можно и без функций.
 

webdeveloper

Guest
Автор оригинала: [VS]
webdeveloper:
сядь и 10 минут подумай - возможны ли другие реализации этого класса, где
а) эти данные не будут храниться в виде переменных
или
б) при изменении/установки этих данных нужно еще что-то дополнительное делать
или
с) возникнет ошибка, если в процессе работы эти данные кто-то извне изменит

если один из этих трех пунктов выполнится, то делай функции.

Если ты уверен что ни один из этих пунктов не выполнится (обычный случай для простых классов с короткой жизнью и которые не нужны нигде кроме одного особенного проэкта) - то можно и без функций.
не уверен вообще то :( тоесть можно конечно обойтись и без этих функций, но на случай будующей модернизации проекта они могли бы пригодится.
 

[VS]

Guest
мораль в догонку:

когда говорят OOP - это хорошо - это не значит что нужно все подряд делать на классах, используя полиморфизм, ...

в конце концов, OOP это не только классы.

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

некоторые вещи намного лучше и удобнее реализуются БЕЗ классов. и именно БЕЗ классов универсальности больше получается. В С++ можно увидеть много примеров с templates.

попробую за уши притянуть PHP пример:
PHP:
function count_tree_branches($tree)
{
   $count = sizeof($tree->get_branches());
   forech($tree->get_branches() as $branch)
       $count += count_tree_branches($branch);
   return $branch;
}
эта функция применима к любому обьекту $tree, с соответствующей функцией get_branches().
У нас может быть много разных классов представляющих деревья, у которых есть функция count_tree_branches().

Так вместо реализации count_tree_branches() в каждом классе будет проще вызывать внешнюю функцию count_tree_branches().
 

[VS]

Guest
Автор оригинала: webdeveloper
не уверен вообще то :( тоесть можно конечно обойтись и без этих функций, но на случай будующей модернизации проекта они могли бы пригодится.
вот из подобных решений и заключается работа OOP программера :)
 

webdeveloper

Guest
Автор оригинала: [VS]
PHP:
function count_tree_branches($tree)
{
   $count = sizeof($tree->get_branches());
   forech($tree->get_branches() as $branch)
       $count += count_tree_branches($branch);
   return $branch;
}
эта функция применима к любому обьекту $tree, с соответствующей функцией get_branches().
У нас может быть много разных классов представляющих деревья, у которых есть функция count_tree_branches().

Так вместо реализации count_tree_branches() в каждом классе будет проще вызывать внешнюю функцию count_tree_branches().
Согласен, а можно им еще сделать общего предка например и там определить эту функцию. Вообщем то путей множество.

Честно говоря если бы был не РНР а джава или С++ например, то я бы даже и не спрашивал про эти методы. А тут просто размеры файлов разрастаются до безобразия. Еще каждую функцию нужно задокументировать. Вообщем у меня получается около 300 лишних строк кода, без кторых вообщем то можно обойтись, но тогда будет на так красиво и не так выдержано с точки зрения ООП.

Вообще то можно конечно наплевать на эти 300 строк и не думать об этом - я же на Яху пишу, в конце концов. Но хотелось просто услышать мнение других людей. Хотя теперь еще меньше понятно стало :)
 

[VS]

Guest
Автор оригинала: webdeveloper
Согласен, а можно им еще сделать общего предка например и там определить эту функцию. Вообщем то путей множество.
Путей много, но правильных мало :)
если логически эти классы связаны общим предком - то лучше сделать в нем функцию эту.
К сожалению некоторые за уши связывают абсолютно разные классы общими предками из-за подобных случаев.
В языках не поддерживающих шаблоны и generic programming по другому нельзя. В С++ и SmallTalk можно с помощью templates создавать именно алгоритмы.

Честно говоря если бы был не РНР а джава или С++ например, то я бы даже и не спрашивал про эти методы. А тут просто размеры файлов разрастаются до безобразия. Еще каждую функцию нужно задокументировать. Вообщем у меня получается около 300 лишних строк кода, без кторых вообщем то можно обойтись, но тогда будет на так красиво и не так выдержано с точки зрения ООП.
Если в классе 300 лишних строк кода - появляется вопрос - сколько вообще в классе строк кода?
может пора devide and conquer?

Вообще то можно конечно наплевать на эти 300 строк и не думать об этом - я же на Яху пишу, в конце концов. Но хотелось просто услышать мнение других людей. Хотя теперь еще меньше понятно стало :)
нет универсальных вариантов, потому и ценятся опытные OOP программеры, так как для каждого отдельного варианта быстро выработают правильное решение :)
 

webdeveloper

Guest
Есть класс Content и есть класс ContentSearchable

В обоих этих классах порядка 600 строк коода. Поюс есть еще ContentAdmin extends Content - плюс еще 300 строк.

Вот если все подобные методы удалить то можно было бы сократиь общий обем этих классов порядочно.

Вообще - что считается нормальным объемом РНР файла - 100 строк, 1000 строк, 500 строк?
 

[VS]

Guest
не хочу ничего утверждать, имхо слишком индивидуально все, сейчас посмотрел на свои файлы, есть до 700 строк, но там логически сложно разбивать на части.
 

[VS]

Guest
Автор оригинала: webdeveloper
Есть класс Content и есть класс ContentSearchable

В обоих этих классах порядка 600 строк коода. Поюс есть еще ContentAdmin extends Content - плюс еще 300 строк.
Так у тебя несколько классов в одном файле?
Если 600 строк кода - я бы в отдельные файлы классы выкладывал.
 

webdeveloper

Guest
вот и я сижу и думаю - засунуить их в один файл или по разным растащить
 

webdeveloper

Guest
я вообще могу их выложить сюда что бы посмотреть на них, если есть желание
 

[VS]

Guest
Автор оригинала: webdeveloper
я вообще могу их выложить сюда что бы посмотреть на них, если есть желание
честно?
нет :)

я все классы представляющие идеологии держу в отдельных файлах,
простые классы, классы структур, и служебные классы могу в одном файле несколько держать.
 

webdeveloper

Guest
Автор оригинала: [VS]
честно?
нет :)
конечно честно - я всегда правду говорю :)

я все классы представляющие идеологии держу в отдельных файлах, простые классы, классы структур, и служебные классы могу в одном файле несколько держать.
У меня примерно так же сделано. Есть packageSyatem.php - там есть CDatabase, CTemplate, CError, CUtils - те что по любому во всех вайлах нужны. Все они потом вызываются из класса CSystem.
PHP:
$content = new CContent();
$content->setDatabase($system->getDatabase());

...

$userId = $system->getPostParameter("txtUserName");
и так далее
 

Grey_EM

Guest
Автор оригинала: webdeveloper
Есть класс Content и есть класс ContentSearchable

В обоих этих классах порядка 600 строк коода. Поюс есть еще ContentAdmin extends Content - плюс еще 300 строк.

Вот если все подобные методы удалить то можно было бы сократиь общий обем этих классов порядочно.

Вообще - что считается нормальным объемом РНР файла - 100 строк, 1000 строк, 500 строк?
Рекомендую вынести каждый класс в отдельный файл.
Имя файла пусть соотвествует имени класса.
Поиск нужного класса в этом случае упрощается.
P.S. Кстати сколько у твоих классов методов?
Класс с количеством методов более 6-9 в php для меня уже повод подозревать что oop человек использует впервые.
 

[VS]

Guest
Grey: странные у тебя понятия.
Класс с более 9 методов - это нормальная вещь.
 

Grey_EM

Guest
Автор оригинала: [VS]
Grey: странные у тебя понятия.
Класс с более 9 методов - это нормальная вещь.
:)
Про магию 3-6-9 слышал?
:)
У всех народов есть сказки, в которых фигурирует магическое число 9 (или 3 или 6, но это реже)
Доказано, что есть физиологическое объяснение этому факту.
9 граничное число, которое эффективно воспринимается (запоминается) мозгом. Далее начинаются уже проблемы.
Число методов не более девяти упрощает понимание и запоминание структуры класса.
Около 70% классов (из тех что мне пришлось видеть) с числом методов более девяти элементарно рефакторится в более простые и не раздутые.
P.S. Всегда есть варианты, когда данное правило неприменимо, хотя количество действительно сложных проектов на php, со сложными и глубокими иерархиями объектов стремится к нулю.
 
Сверху