[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Доступность методов класса в новом объекте
Страницы: 1, 2
AlexJN
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
Передать в объект класса class2, объект class1 и сделать class2 по типу прокси.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
SlavaFr
Цитата (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
Цитата (SlavaFr @ 13.06.2016 - 15:53)
[QUOTE=AlexJN,27.05.2016 - 10:35]
class class1{	

1) оператору new, вообще не чего делать в функициях... Советую почитать Clean Code Development.


а как тогда быть например с порождающими паттеранми например? я просто понять не могу.... порождение и есть по сути результат действия new. Что то не пойму никак

docentovich
Цитата (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?
chee
Цитата (AlexJN @ 27.05.2016 - 14:35)
Как внутри класса class2 сделать доступным метод класса "class1" "f_1__c_1"

class class2 extends class1 {}


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
chee
Как ты мог?? biggrin.gif
Наследование... Тут уже композицию предали анафеме:
Цитата (SlavaFr @ 13.06.2016 - 11:53)
оператору new, вообще не чего делать в функициях..



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

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

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

user posted image
chee
twin, ну он дал абстрактный пример, ну я и решил его "абстрактно", я вообще не понимаю, что автор хочет.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
SlavaFr
Цитата (docentovich @ 14.06.2016 - 10:31)
а как тогда быть например с порождающими паттеранми например? я просто понять не могу.... порождение и есть по сути результат действия new. Что то не пойму никак

Порождени с оператором new делается или в factrory или в грязном контроллере, хотя любые серьёзные библиотеки имеющие DependencyInjectionContainer имеют возможность конфигурировать параметры .
Проблема в том, что при написание библиотек всегда требуется возможность их тестирования. Как только начинаешь заниматься тестированием, то понимаешь, что тебе нужна возможность заменять участки кода в твоей программе и тестировать отдельно тестировать функционал f_2__c_1() да так, что бы не зависить на прямую от класса class2 который ты вызываешь при помощи new... По этому class2 надо передовать по возможности как параметр, Это тебе даст возможность заменить инснацию этого класса не меняя кода самого класса.

Как то так...


_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
SlavaFr
Цитата (twin @ 15.06.2016 - 08:05)
chee
Как ты мог?? biggrin.gif
Наследование... Тут уже композицию предали анафеме:

Ну композицию вроде не трогали smile.gif
В любом случае, компосиция лучше чем наследовоательность, опять же благодаря тому, что при тестирование не обязательно тестировать парент класс... и сам парент класс можно заменить прямо в runtime. smile.gif


_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
chee
Цитата (SlavaFr @ 4.07.2016 - 18:27)
В любом случае, компосиция лучше чем наследовоательность,

почему лучше?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
SlavaFr
Цитата (chee @ 4.07.2016 - 16:32)
почему лучше?


1) парент класс заменяется в любой момент прямо во время протикания самой программы.
2) парент класс тестируется без участвия наследников.


_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
chee
SlavaFr, тестирование это нисколько не довод.

Про рантайм, то опять же, сценарий подмены объекта в рантайме подразумевает соблюдения принципов ликсков. А как их реализовать? Через наследованияе. К примеру, есть тип, наследуешь, изменяешь метод, получаешь тот же тип, а потом через композицию можешь подставить его в рантайме с помощью фабрик и контейнеров.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Guest
Цитата (SlavaFr @ 5.07.2016 - 14:20)
Цитата (chee @ 4.07.2016 - 16:32)
почему лучше?


1) парент класс заменяется в любой момент прямо во время протикания самой программы.
2) парент класс тестируется без участвия наследников.

https://github.com/Codeception/AspectMock

Мокает всё, включая нативные php функции.

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

Если есть возможность перенести бизнес логику внутрь другого приложения/фреймворка не изменяя её код и написав расходники ввиде контроллеров/репозиториев всё заработает в новом окружении, тогда всё в порядке.
Guest
Цитата (SlavaFr @ 4.07.2016 - 18:22)
[QUOTE=docentovich,14.06.2016 - 10:31]По этому class2 надо передовать по возможности как параметр, Это тебе даст возможность заменить инснацию этого класса не меняя кода самого класса.

Пытаться использовать dependency injection везде в своем коде - избыточно и не имеет смысла. Внедрять зависимости в бизнес-логику - это правильно. Юнит-тестами покрывать нужно именно её.

В контроллерах и в остальном коде уровня приложения можно свободно использовать оператор new и не думать о lose coupling, поскольку этот код уже тесно связан с приложением/фреймворком и делать в него внедрение зависимостей бессмысленно. Такой код не принято покрывать юнит-тестами, он очень простой и может постоянно меняться, например когда мигрируем на новую мажорную версию приложения/фреймворка. И это верно, было бы глупо при каждой такой миграции переписывать юнит-тесты. Для этого пишут уже функциональные тесты.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.