Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Классы, методы и параметры
Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010 Откуда: Тверь
Помог: 4 раз(а)
Всем доброго времени суток!
Пришла в голову мысль следующего содержания: "А что если убрать у методов класса все параметры, ввести классу доп поле и необходимые для функции параметры брать из этолго поля?"
пример
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Ну некоторые свойства клссаа могут хранить какие-то его настройки, его состояние, а методы действовать, опираясь на это состояние. Но специально использовать состояние класса как способ передачи параметров - не круто.
Во-первых, непонятно зачем. Во-вторых, можно забыть заполнить какой-нибудь параметр, он будет нести в себе значение с предыдущего вызова, а это весьма неочевидная ошибка, ее долго дебажить придется. Потом, инициализация этих "параметров" метода - лишний код, менее компактный, чем традиционные вызовы. С параметрами по умочанию тоже не очень понятно что делать.
Вот.
EuGen
Отправлено: 16 Июня, 2011 - 21:19:41
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Это - side-effect.
side-эффектов надо избегать. Всегда. Не бывает исключений.
Простой пример:
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
side-effect - это "боковой эффект". То есть что-либо, меняющее данные или поведение неявным образом. Яркий пример side-effect - передача параметров по ссылке.
Например, preg_match изменяет третий параметр, помещая туда результат. И это - side-effect.
Использование global (глобальных переменных) есть тоже side-effect (даже в случае, если переменная не меняется), так как изменяет поведение неявно.
Присваивание значений суперглобальным массивам в скрипте можно тоже в большинстве случаев рассматривать как Side-effect.
В общем, идея проста. Функция/метод/класс не имеет side-effect, если его можно взять в цельном виде без контекста и поместить в другой проект, сохранив при этом его работоспособность.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Давит
Отправлено: 17 Июня, 2011 - 01:05:03
Частый гость
Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2011
Помог: 2 раз(а)
Slavenin пишет:
Пришла в голову мысль следующего содержания: "А что если убрать у методов класса все параметры, ввести классу доп поле и необходимые для функции параметры брать из этолго поля?"
пример
Ваш код без var $param; тоже будет работать.
php 5
как на вашей примере та и на этой примере не контролируется ситуация, когда создалось что то где то.
Но прежде чем создалось, то что php создал, php в классе питается найти магический метод __set(), но как только php найдет метод __set() в этом случае опять же php будет искать метод __get()
Что выдаст? ... ошибку ... фатальную Хотя поведение вполне нормальное и ложится в логику любого программиста.
Как вы дебажить такие классы будете? Откуда вы знаете, что будет лежать в этом param[0] ?
Есть такая штука, как геттеры и сеттеры, вы о них знаете?
Какие проблемы можно решить с помощью вашего класса? Если есть хоть 1 проблема, самым удобным решением которой было бы использовать ваш класс - значит класс юзабельный. (Добавление)
Любая функция и класс должны описываться неким интерфейсом, как должен выглядеть интерфес для этого класса?
Slavenin
Отправлено: 17 Июня, 2011 - 12:12:00
Посетитель
Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010 Откуда: Тверь
Помог: 4 раз(а)
Цитата:
Есть такая штука, как геттеры и сеттеры, вы о них знаете?
Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010 Откуда: Тверь
Помог: 4 раз(а)
Stierus, все это конечно хорошо. пример нормального интерфейса я и сам могу привести. Разговор шел про класс-пример. с тем же успехом имена параметров можно заменить на порядковые номера массива.
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
"А что если убрать у методов класса все параметры, ввести классу доп поле и необходимые для функции параметры брать из этолго поля?"
единственный вопрос - "зачем?" ... к ответу на этот вопрос я и пытаюсь вас привести наводящими вопросами. (Добавление)
Да и пример интерфейса привел для этого же ... интерфейс должен четко описывать, что делает функция, что принимает, какие исключения и когда выкидывает и какой тип данных (если это объект или массив - какая у них структура или тип) возвращает. если вы сможете составить интерфейс, отвечающий на все эти вопросы - значит класс юзабельный и в каких-то случаях даже полезный. Лично я не вижу, как мне ответить на эти вопросы.
Slavenin
Отправлено: 17 Июня, 2011 - 15:35:15
Посетитель
Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010 Откуда: Тверь
Помог: 4 раз(а)
Stierus пишет:
единственный вопрос - "зачем?"
для того чтобы полностью скрыть реализацию функции в классе. Была мысль реализовать этот параметр как приватный и в виде стека и работать с ним только специальными функциями. к тому же нет необходимости в переменных которые будут курсировать по коду, каждая функция знает какой параметр ей нужно использовать, при нормальной реализации она будет выбрасывать исключение если параметр несоответствующего типа или не определен.
эх, жаль все-таки, что php не строго типизированный язык... многих проблем можно было бы избежать...
по-поводу интерфейсов. по сути это наворот абстрактных функций из с++, где, если мне не изменяет память, их можно определить прямо внутри класса... если класс не очень сложный, то интерфейс ему не уперся, ИМХО!
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.