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

> Доступность методов класса в новом объекте, Доступность методов класса в новом объекте внутри класса
AlexJN  
 ۩  Дата
Цитировать сообщение

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



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 1
Пользователь №: 43001
На форуме: 7 месяцев, 19 дней
Карма:




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" не подходит
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
T1grOK  
Дата
Цитировать сообщение

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



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

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2732
Пользователь №: 24406
На форуме: 6 лет, 3 месяца
Карма: 176




Передать в объект класса class2, объект class1 и сделать class2 по типу прокси.


--------------------
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
PMПисьмо на e-mail пользователюСайт пользователя
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
SlavaFr  
Дата
Цитировать сообщение

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



Новичок
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1535
Пользователь №: 22453
На форуме: 6 лет, 7 месяцев, 15 дней
Карма: 104




Цитата (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();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
docentovich  
Дата
Цитировать сообщение

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



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 9 месяцев, 15 дней
Карма:




Цитата (SlavaFr @ 13.06.2016 - 15:53)
[QUOTE=AlexJN,27.05.2016 - 10:35]
class class1{	

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


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

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

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



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 9 месяцев, 15 дней
Карма:




Цитата (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?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
chee  
Дата
Цитировать сообщение

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



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

Профиль
Группа: Сын полка
Сообщений: 1847
Пользователь №: 38654
На форуме: 3 года, 13 дней
Карма: 40




Цитата (AlexJN @ 27.05.2016 - 14:35)
Как внутри класса class2 сделать доступным метод класса "class1" "f_1__c_1"

class class2 extends class1 {}


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

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

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



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

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

Трезвый :
6 лет, 23 дня


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



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

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

Зачем ворошить старое, когда можно наворотить новое?

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

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



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

Профиль
Группа: Сын полка
Сообщений: 1847
Пользователь №: 38654
На форуме: 3 года, 13 дней
Карма: 40




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


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

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

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



Новичок
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1535
Пользователь №: 22453
На форуме: 6 лет, 7 месяцев, 15 дней
Карма: 104




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

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

Как то так...


--------------------
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
SlavaFr  
Дата
Цитировать сообщение

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



Новичок
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1535
Пользователь №: 22453
На форуме: 6 лет, 7 месяцев, 15 дней
Карма: 104




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

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


--------------------
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
chee  
Дата
Цитировать сообщение

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



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

Профиль
Группа: Сын полка
Сообщений: 1847
Пользователь №: 38654
На форуме: 3 года, 13 дней
Карма: 40




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

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


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

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

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



Новичок
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1535
Пользователь №: 22453
На форуме: 6 лет, 7 месяцев, 15 дней
Карма: 104




Цитата (chee @ 4.07.2016 - 16:32)
почему лучше?


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


--------------------
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
chee  
Дата
Цитировать сообщение

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



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

Профиль
Группа: Сын полка
Сообщений: 1847
Пользователь №: 38654
На форуме: 3 года, 13 дней
Карма: 40




SlavaFr, тестирование это нисколько не довод.

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


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

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


Гость пожелал остаться неизвестным

Unregistered









Цитата (SlavaFr @ 5.07.2016 - 14:20)
Цитата (chee @ 4.07.2016 - 16:32)
почему лучше?


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

https://github.com/Codeception/AspectMock

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

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

Если есть возможность перенести бизнес логику внутрь другого приложения/фреймворка не изменяя её код и написав расходники ввиде контроллеров/репозиториев всё заработает в новом окружении, тогда всё в порядке.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









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

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

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

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

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