AlexJN
27.05.2016 - 14:35
class class1{
function f_1__c_1(){
;
}
function f_2__c_1(){
$obj_2 = new class2();
}
}
class class2{
function f_1__c_2(){
;
}
}
// Как внутри класса class2 сделать доступным метод класса "class1" "f_1__c_1"
// Вариант передачи метода класса "class1" как параметра функции "f_2__c_1" не подходит
T1grOK
27.05.2016 - 14:53
Передать в объект класса class2, объект class1 и сделать class2 по типу прокси.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
SlavaFr
13.06.2016 - 15:53
Цитата (AlexJN @ 27.05.2016 - 10:35) |
class class1{ function f_1__c_1(){ ; } function f_2__c_1(){ $obj_2 = new class2(); } } class class2{ function f_1__c_2(){ ; } } // Как внутри класса class2 сделать доступным метод класса "class1" "f_1__c_1" // Вариант передачи метода класса "class1" как параметра функции "f_2__c_1" не подходит |
1) оператору new, вообще не чего делать в функициях... Советую почитать Clean Code Development.
2) Для вызова метода других классов требуется инстанции других объектов.
Например :
class class2
{
private $instanceClasse1;
public function __construct(class1 $object)
{
$this->instanceClasse1 = $object;
}
function f_1__c_2()
{
return $this->instanceClasse1->f_1__c_1();
}
}
_____________
↓↓↓↓↓↓↓↓↓↓ответ может быть здесьили в mysql_error();
docentovich
14.06.2016 - 14:31
Цитата (SlavaFr @ 13.06.2016 - 15:53) |
[QUOTE=AlexJN,27.05.2016 - 10:35] class class1{
1) оператору new, вообще не чего делать в функициях... Советую почитать Clean Code Development.
|
а как тогда быть например с порождающими паттеранми например? я просто понять не могу.... порождение и есть по сути результат действия new. Что то не пойму никак
docentovich
14.06.2016 - 14:32
Цитата (AlexJN @ 27.05.2016 - 14:35) |
class class1{ function f_1__c_1(){ ; } function f_2__c_1(){ $obj_2 = new class2(); } } class class2{ function f_1__c_2(){ ; } } // Как внутри класса class2 сделать доступным метод класса "class1" "f_1__c_1" // Вариант передачи метода класса "class1" как параметра функции "f_2__c_1" не подходит |
А статикой сделать метод класса 2?
Цитата (AlexJN @ 27.05.2016 - 14:35) |
Как внутри класса class2 сделать доступным метод класса "class1" "f_1__c_1" |
class class2 extends class1 {}
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
cheeКак ты мог??
Наследование... Тут уже композицию предали анафеме:
Цитата (SlavaFr @ 13.06.2016 - 11:53) |
оператору new, вообще не чего делать в функициях.. |
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
twin, ну он дал абстрактный пример, ну я и решил его "абстрактно", я вообще не понимаю, что автор хочет.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
SlavaFr
4.07.2016 - 18:22
Цитата (docentovich @ 14.06.2016 - 10:31) |
а как тогда быть например с порождающими паттеранми например? я просто понять не могу.... порождение и есть по сути результат действия new. Что то не пойму никак |
Порождени с оператором new делается или в factrory или в грязном контроллере, хотя любые серьёзные библиотеки имеющие DependencyInjectionContainer имеют возможность конфигурировать параметры .
Проблема в том, что при написание библиотек всегда требуется возможность их тестирования. Как только начинаешь заниматься тестированием, то понимаешь, что тебе нужна возможность заменять участки кода в твоей программе и тестировать отдельно тестировать функционал f_2__c_1() да так, что бы не зависить на прямую от класса class2 который ты вызываешь при помощи new... По этому class2 надо передовать по возможности как параметр, Это тебе даст возможность заменить инснацию этого класса не меняя кода самого класса.
Как то так...
_____________
↓↓↓↓↓↓↓↓↓↓ответ может быть здесьили в mysql_error();
SlavaFr
4.07.2016 - 18:27
Цитата (twin @ 15.06.2016 - 08:05) |
chee Как ты мог?? Наследование... Тут уже композицию предали анафеме: |
Ну композицию вроде не трогали
В любом случае, компосиция лучше чем наследовоательность, опять же благодаря тому, что при тестирование не обязательно тестировать парент класс... и сам парент класс можно заменить прямо в runtime.
_____________
↓↓↓↓↓↓↓↓↓↓ответ может быть здесьили в mysql_error();
Цитата (SlavaFr @ 4.07.2016 - 18:27) |
В любом случае, компосиция лучше чем наследовоательность, |
почему лучше?
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
SlavaFr
5.07.2016 - 14:20
Цитата (chee @ 4.07.2016 - 16:32) |
почему лучше? |
1) парент класс заменяется в любой момент прямо во время протикания самой программы.
2) парент класс тестируется без участвия наследников.
_____________
↓↓↓↓↓↓↓↓↓↓ответ может быть здесьили в mysql_error();
SlavaFr, тестирование это нисколько не довод.
Про рантайм, то опять же, сценарий подмены объекта в рантайме подразумевает соблюдения принципов ликсков. А как их реализовать? Через наследованияе. К примеру, есть тип, наследуешь, изменяешь метод, получаешь тот же тип, а потом через композицию можешь подставить его в рантайме с помощью фабрик и контейнеров.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Цитата (SlavaFr @ 5.07.2016 - 14:20) |
Цитата (chee @ 4.07.2016 - 16:32) | почему лучше? |
1) парент класс заменяется в любой момент прямо во время протикания самой программы. 2) парент класс тестируется без участвия наследников.
|
https://github.com/Codeception/AspectMockМокает всё, включая нативные php функции.
Но лучше ориентироваться на то, чтобы бизнес-логика не зависила от слоя приложения/фреймворка и обложить её абстракциями от источника данных (бд/фс/озу/api). Если это постоянно держать в голове, код сам собой нормально спроектируется.
Если есть возможность перенести бизнес логику внутрь другого приложения/фреймворка не изменяя её код и написав расходники ввиде контроллеров/репозиториев всё заработает в новом окружении, тогда всё в порядке.
Цитата (SlavaFr @ 4.07.2016 - 18:22) |
[QUOTE=docentovich,14.06.2016 - 10:31]По этому class2 надо передовать по возможности как параметр, Это тебе даст возможность заменить инснацию этого класса не меняя кода самого класса. |
Пытаться использовать dependency injection везде в своем коде - избыточно и не имеет смысла. Внедрять зависимости в бизнес-логику - это правильно. Юнит-тестами покрывать нужно именно её.
В контроллерах и в остальном коде уровня приложения можно свободно использовать оператор new и не думать о lose coupling, поскольку этот код уже тесно связан с приложением/фреймворком и делать в него внедрение зависимостей бессмысленно. Такой код не принято покрывать юнит-тестами, он очень простой и может постоянно меняться, например когда мигрируем на новую мажорную версию приложения/фреймворка. И это верно, было бы глупо при каждой такой миграции переписывать юнит-тесты. Для этого пишут уже функциональные тесты.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.