Имя класса уже является первым аргументом конструктора, так почему бы не использовать это? Вам не нужно тянуться к чему-либо, и если вы решите, что ситуация сложнее, чем вы изначально предполагали, вы не искусственно вызвали скачок скорости. Этот код работает с наследованием или без него:
sub new {
my( $class, @args ) = @_;
...
bless {...}, $class;
}
Примите во внимание все, что вы программируете, насколько вам придется измениться, если ситуация с кодом изменилась. Возможно, вы добавите пару дополнительных шагов, которые вам не нужны сразу, но это сделает код гибким для тех времен, когда вы поймете, что вам действительно нужны эти случаи. В вашем случае вам действительно нужно проделать дополнительную работу, чтобы игнорировать аргумент invocant, который Perl специально указывает, какой класс пытается создать новый объект.
Например, вы создаете свой класс, это работает для вас и делает свою работу хорошо. Он работает настолько хорошо, что вы делитесь им, и кто-то другой использует его, и они в основном довольны этим некоторое время, пока им не понадобится эта маленькая модификация. Они должны иметь возможность подкласса вашего модуля (так что никаких изменений в нем или для вас), чтобы расширить или переопределить метод. Но ваш код не позволяет этого, потому что вы благословили объект более ограниченным образом, что не принесло никакой пользы.
Первый бит кода в вашем вопросе тоже использует первый аргумент, но на самом деле это не рецепт для конструкторов. Это делает дополнительную вещь, позволяя уже существующему объекту создавать новый. ref
извлекает благословенное имя пакета из объекта и использует его для нового объекта.
Мне не особенно нравится такой способ создания новых объектов, и я думаю, что интерфейс, вероятно, запутает людей. Что должно произойти, когда вы вызываете new для существующего объекта? Вы клонируете существующий? Если это так, есть лучшие имена, такие как clone
(Ruby использует dup
). Вы получаете совершенно свободный sh объект? Если да, то почему вы go просматриваете существующий объект, чтобы получить объект, совершенно не связанный с ним?
Было время, когда во многих примерах OO Perl показывался тот же тип конструктора, и он был скопирован и наклеены во многих местах. Но с тех пор мы многому научились. Может быть, у вас есть хороший ответ, почему вы это допустили, но пока я не слышал убедительного ответа.