Кто, как начинал? Нужно ли знать настрйки сервера? Нужно ли знать другой язык?

Fortop

Новичок
Собственно проблемы с перегрузкой нет как класс. Она возникла из-за строгой типизации. В динамически типизированных этого вопроса не стоит вовсе.

Мгм, убийственный аргумент. Даже не поспоришь :(

Что могу предложить... - Builder || Factory

Впрочем, чем некрасиво использование
[m]func_get_args[/m]
или
PHP:
__construct($required, $params = array())
мне не понять, но о вкусах не спорят.
 

гемоглобин

Новичок
Автор оригинала: baev
— дело в том, что сейчас как бы общепринятой является точка зрения, что у человека после 25 лет мозг «не развивается»: количественно знания могут накапливаться, а вот качественные изменения могут быть только в сторону умственного помешательства.
И речь как раз про то, что в 28 лет начинать интересоваться «программированием, логикой и цифрами, которых так избегал в школе» — уже поздно. Неадекватно возможностям.
пруфлинк в студию

а то все эти "общепринятые" теории часто на поверку обычно оказываются бредом журналиста желтой газетенки
 

fixxxer

К.О.
Партнер клуба
>>так это невозможность создать несколько конструкторов класса

Я это так обхожу:
PHP:
class User {

    public static function constructById($id) {
        $self = new static;
        return $self->loadById($id) ? $self : null; // Exception по вкусу
    }

    public static function constructBySession(ISession $Session) {
         ...
    }

}
Заодно семантичности прибавляется. Кстати, что-то похожее было у Фаулера.
 

baev

‹°°¬•
Команда форума
пруфлинк в студию
— у меня информация со слов моей матери-психолога.
После её смерти все её бумаги и всю литературу «по вопросу» отдали её сотрудникам. Так что, к сожалению, я даже названия «что почитать» не могу сказать.

И, да — я вполне мог что-то перепутать. Я, всё-таки, не специалист. Да и времени уже порядочно прошло.
 

AmdY

Пью пиво
Команда форума
без пруфлинка в данном вопросе никак. бумажка важнее собственного жизненного опыта :(.
 

Lightning

Трудоголик
Можно узнать зачем?
Конечно можно:
Лучше несколько конструкторов, чем один с вложенными if-ами, проверяющими количество и тип аргументов. Меньше кода + читаемость.

Впрочем, можно использовать способ, который показал fixxxer.
 

craz

Нестандартное звание
вы по-моему очень помогли человеку))) ему стало все ясно и понятно)
 

гемоглобин

Новичок
без пруфлинка в данном вопросе никак. бумажка важнее собственного жизненного опыта
Просто мой жизненный опыт не подтверждает эту теорию. Снижается способность к обучению - да. Но не полностью - это раз. И не чётко в 25 - это два. Имхо у всех по разному.
 

Krishna

Продался Java
Собственно проблемы с перегрузкой нет как класс. Она возникла из-за строгой типизации. В динамически типизированных этого вопроса не стоит вовсе.
Абсолютно ничем не подкреплённое мнение, имхо :)
Вопрос стоит, хотя бы судя потому, что type hinting таки имеется.

fixxxer

Я это так обхожу:
Я толи ступил, толи речь о фабрике и классе сущности в одном флаконе?

Полиморфизм то как попользовать при разных именах создающего метода?
 

fixxxer

К.О.
Партнер клуба
>> Полиморфизм то как попользовать при разных именах создающего метода?

А зачем полиморфизм ради полиморфизма? :)

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

Вообще такого типа перегрузка при наличии в языке интерфейсов зачастую совершенно не оправдана и обусловлена странностями архитектуры ("а вот там у нас почему то кидается ид вместо объекта - ну и хрен с ним, добавим еще один метод" - это ничем не лучше switch по типу, такое же говно, только в красивой обертке)
 

Sherman

Mephi
Да, оверлоадинг - это жалкая попытка сымитировать pattern matching.
 

Lightning

Трудоголик
Код:
class MyClass {
    private Class1 object1;
    private Class2 object2;

    public MyClass( Class1 object1, Class2 object2 ) {
        this.object1 = object1;
        this.object2 = object2;
    }

    public MyClass( Class1 object1 ) {
        this( object1, new Class2( /* default params */ ) )
    }

    public MyClass( Class2 object2 ) {
        this( new Class1( /* default params */ ), object2 )
    }
}
При чем тут pattern matching?
 

Lightning

Трудоголик
fixxxer
В смысле, IoC-контейнеры? Зачем?
Тут просто значения по-умолчанию. Для текущего класса, а не для всей системы.

-~{}~ 04.05.10 23:17:

В общем, есть еще много примеров, где несколько конструкторов необходимы. Посмотрите в тех же java-библиотеках.
Поэтому, имхо, перегрузка конструкторов - нужная фича.
 

fixxxer

К.О.
Партнер клуба
ну и чем это тогда, лучше чем

MyClass::construct($Class1,$Class2)
MyClass::constructByClass1($Class1)
MyClass::constructByClass2($Class2)
?

вот я себе не могу представить ситуацию, когда мы при создании экземпляра MyClass не знаем, что передаем ему в конструктор. точнее конечно могу, но это значит, что проектировал систему не очень умный человек.

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

Krishna

Продался Java
вот я себе не могу представить ситуацию, когда мы при создании экземпляра MyClass не знаем, что передаем ему в конструктор.
Например, создаём дерево (класс Tree), содержащее элементы одного класса E (одного из допустимых).
И объект, реализующий дерево, должен позволять добавлять в себя только объекты того класса, объект которого был передан конструктору класса Tree в качестве параметра - корневого элемента. Можно действовать через рефлексию, но через перегрузку конструктора было бы читабельнее, нет?.

Я, кстати, не выступаю конкретно за перегрузку конструктора. Я выступаю за перегрузку методов вообще. Сказали A c typehinting - скажите B с перегрузкой методов, хоть бы и только по классам.
 

Fortop

Новичок
И объект, реализующий дерево, должен позволять добавлять в себя только объекты того класса, объект которого был передан конструктору класса Tree в качестве параметра - корневого элемента.
Не осознал полета мысли. Почему именно так?

PHP:
interface TreeElement {};

interface Tree implements TreeElement {
    public function __construct(TreeElement $obj) {}
    public function addNode(TreeElement $obj) {}
};
class ConcreteTree implements Tree {

    public function __construct(TreeElement $obj) {
        $this->_root = $obj;
    }

    public function addNode(TreeElement $obj) {
        if ($obj instanceof get_class($this->_root)) {
            // чего-то делаем
        } else {
            throw new MyConcreteTreeException('wrong type of Node');
        }
    }
}

$t = new Tree(new Item implements TreeElement);
$t->addNode(new SomeOtherItem implements TreeElement);
$t->addNode(new AndOneMoreItem implements TreeElement);
Причем тут перегрузка?
 

Krishna

Продался Java
Fortop

Ты вводишь интерфейс-маркер, не зер гуд, кстати.
Наверное, перегрузка, дейтсивтельно не к месту, в данном примере, рефлексия как раз больше подойдёт.
Больше не буду спросони примеры придумывать))
 
Сверху