Способ именования конструкторов и деструкторов
От: x-code  
Дата: 07.04.11 09:46
Оценка:
Как думаете, какой способ предпочтительнее с точки зрения дизайна языка программирования?
Из того, что попадалось:
1. имя класса
class MyClass
{
MyClass();
~MyClass();
};

2. ключевое слово this или другое, используемое также для каких-либо других целей
class MyClass
{
this();
~this();
};


3. отдельные ключевые слова = функции с предопределенными именами
class MyClass
{
ctor();
dtor();
};

Учитывается понятность и внешний вид кода, отсутствие неоднозначностей, удобство рефакторинга и работы IDE и любые другие факторы, которые могут иметь место.
Re: Ctor/dtor
От: Qbit86 Кипр
Дата: 07.04.11 09:48
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>3. отдельные ключевые слова = функции с предопределенными именами

XC>class MyClass
XC>{
XC> ctor();
XC> dtor();
XC>};

Мне последний вариант больше нравится.
Глаза у меня добрые, но рубашка — смирительная!
Re: Способ именования конструкторов и деструкторов
От: Anpek  
Дата: 07.04.11 09:49
Оценка: -1
Здравствуйте, x-code, Вы писали:

По-моему, первый. Констурктор же вызывается не изнутри класса, а откуда-то из другого места, поэтому this там будет неоднозначно воприниматься. А ctor — одинковое название для любого класса — то же визуально плохо, так как набор этих самых ctor запутает. А в первом собсобе сразу видно кто для чего и зачем
Re[2]: Определение, вызов
От: Qbit86 Кипр
Дата: 07.04.11 09:51
Оценка:
Здравствуйте, Anpek, Вы писали:

A>По-моему, первый. Констурктор же вызывается не изнутри класса, а откуда-то из другого места, поэтому this там будет неоднозначно воприниматься. А ctor — одинковое название для любого класса — то же визуально плохо, так как набор этих самых ctor запутает. А в первом собсобе сразу видно кто для чего и зачем


Топикстартер предоставил синтаксис определения, а не вызова. Вызов, я так полагаю, по прежнему будет new MyClass(params).
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Определение, вызов
От: x-code  
Дата: 07.04.11 09:52
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Топикстартер предоставил синтаксис определения, а не вызова. Вызов, я так полагаю, по прежнему будет new MyClass(params).


Да, именно так.
Re: Способ именования конструкторов и деструкторов
От: adontz Грузия http://adontz.wordpress.com/
Дата: 07.04.11 09:53
Оценка: +4
Здравствуйте, x-code, Вы писали:

Голосую за №3.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Способ именования конструкторов и деструкторов
От: Temoto  
Дата: 07.04.11 10:52
Оценка:
XC>Как думаете, какой способ предпочтительнее с точки зрения дизайна языка программирования?

XC>Учитывается понятность и внешний вид кода, отсутствие неоднозначностей, удобство рефакторинга и работы IDE и любые другие факторы, которые могут иметь место.


Голосую за №3: предопределённые имена. Обязательно НЕ ключевые, то есть чтоб их можно было использовать в названиях переменных. Хотя последняя хотелка, конечно, сильно зависит от остальных дизайн решений.

Только слова надо поаккуратнее выбрать. В частности, чем единственное чем плохи constructor/destructor — они не глаголы, хотя имена методов по логике должны быть глаголами. create/destroy например.
Re: Способ именования конструкторов и деструкторов
От: Abyx Россия  
Дата: 07.04.11 10:57
Оценка: +3
Здравствуйте, x-code, Вы писали:

[...]

2й или 3й вариант ничем не отличаются, "~this" это такая же лексема что и "dtor". Голосую за любой из них.

1й вариант плох тем что надо повторять компилятору то что он уже знает.
При переименовании класса надо менять имя в бОльшем количестве мест.
Также если код генерируется каким-то метакодом, это делает невозможным многие вещи, например
DEFINE_CLASS_WITH_UNIQUE_NAME
{
    ...
    тут нельзя написать конструктор потому что мы не знаем имя класса
};

или
DEFINE_CLASS(Foo)
{
    ...
    DEFINE_CTOR(Foo) // тут опять надо зачем-то писать имя класса 
    {
        ...
    }
};
In Zen We Trust
Re[2]: Не глаголы
От: Qbit86 Кипр
Дата: 07.04.11 10:58
Оценка:
Здравствуйте, Temoto, Вы писали:

T>...чем единственное чем плохи constructor/destructor — они не глаголы...


Это имеет значение только для вызова. А при вызове существительные «ctor» и «dtor» не используется.
Глаза у меня добрые, но рубашка — смирительная!
Re: Способ именования конструкторов и деструкторов
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 07.04.11 11:07
Оценка: :)
XC>Учитывается понятность и внешний вид кода, отсутствие неоднозначностей, удобство рефакторинга и работы IDE и любые другие факторы, которые могут иметь место.

дублирование информации
устранение дублирование информации — уменьшает накладные расходы при изменении кода (поменять название класса, сделать дубль класса с чуть другим функционалом и т.д.)
имена this/~this, ctor/dtor по сравнению с MyClass уменьшают дублирование информации

конфликт имен (полнота)
полнота(возможность всех вариантов) важна при автоматической генерации кода, интеграции, версионности и т.д., т.е. в тех случаях, когда затруднена возможность произвольного задания имен.
если для объявления конструктора/деструктора используется тот же самый синтаксис, что и для объявления методов, то возникает конфликт имен: есть сложности объявления функций с теми именами, которые зарезервированы для конструктора/деструктора
вариант MyClass делает невозможным объявление метода с именем MyClass.
вариант this запрещает методы this, но для языков где this зарезервированное слово(а не просто контекстно-зависимое), такие методы и так не возможны
вариант ctor/dtor запрещает методы ctor/dtor
конфликт может решаться устранением неоднозначности другими способами:
например(общий для всех трех вариантов, для статически-типизированных языков): метод — отличается добавление объявление результата. MyClass() — конструктор, а void MyClass() — метод.
например(общий для всех трех вариантов): метод — отличается добавлением @ перед названием. MyClass() — конструктор, а @MyClass() — метод.
но при беглом просмотре и для новичков, неоднозначность все равно может возникать

чтение кода с любого места в произвольном направлении (обычно конфликтует с критерием дублирование информации)
полезно при беглом чтении кода, анализе, частичном автоматизированном разборе и т.д.
конструктор/деструктор могут быть достаточно отдалены от объявления самого класса, а для названий this/~this, ctor/dtor вообще нет никаких подсказок о каких конструкторах/деструкторах идет речь, что требует либо аккуратный скроллинг к объявлению класса (при беглом скроллинге можно перескочить на чужое объявление), либо подсказок от IDE. с методами проблема менее критична, т.к. название метода уже часто несет большую часть информации — что это за метод, и название класса необходимо только когда метод реально полиморфный.


зы
порядок критериев по уменьшению времени, сколько они "используются":
чтение кода с любого места в произвольном направлении (бегло читать код приходиться больше всего)
дублирование информации (потом время уходит на рефакторинг)
конфликт имен

поэтому мне больше нравится вариант: MyClass, но с возможностью, если сильно хочется, объявить метод с тем же именем
Re[3]: Не глаголы
От: Temoto  
Дата: 07.04.11 11:13
Оценка:
T>>...чем единственное чем плохи constructor/destructor — они не глаголы...

Q>Это имеет значение только для вызова. А при вызове существительные «ctor» и «dtor» не используется.


Смотря какая грамматика.

Если рассматривать

"constructor" "(" arguments... ")"

, где constructor — ключевое слово, наравне с class/switch/return, то да, вы правы. А если рассматривать

id "(" arguments... ")"

, где "constructor" это частный случай идентификатора и оно не является никаким ключевым словом или специальной грамматической конструкцией, то нет, имя должно подчиняться тем же правилам, что и у остальных методов.
Re[2]: Способ именования конструкторов и деструкторов
От: Abyx Россия  
Дата: 07.04.11 11:16
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>чтение кода с любого места в произвольном направлении (обычно конфликтует с критерием дублирование информации)

1. ИДЕ должна показывать текущий контекст
2. та же проблема с методами — смотришь на метод, и не видишь чей он.
In Zen We Trust
Re: Способ именования конструкторов и деструкторов
От: FR  
Дата: 07.04.11 11:24
Оценка: +2
Здравствуйте, x-code, Вы писали:

XC>Учитывается понятность и внешний вид кода, отсутствие неоднозначностей, удобство рефакторинга и работы IDE и любые другие факторы, которые могут иметь место.


Из практического использования, хоть и очень небольшого языка D, второй вариант удобней чем первый.
Re[4]: Определение, вызов
От: blackhearted Украина  
Дата: 07.04.11 13:06
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Здравствуйте, Qbit86, Вы писали:


Q>>Топикстартер предоставил синтаксис определения, а не вызова. Вызов, я так полагаю, по прежнему будет new MyClass(params).


XC>Да, именно так.


а смысл писать вдобавок методы типа ctor()/this() , если всё равно будет вызываться new MyClass() ???
Re[2]: Способ именования конструкторов и деструкторов
От: blackhearted Украина  
Дата: 07.04.11 13:08
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, x-code, Вы писали:


A>[...]


A>2й или 3й вариант ничем не отличаются, "~this" это такая же лексема что и "dtor". Голосую за любой из них.


A>1й вариант плох тем что надо повторять компилятору то что он уже знает.

A>При переименовании класса надо менять имя в бОльшем количестве мест.
A>Также если код генерируется каким-то метакодом, это делает невозможным многие вещи, например
A>
A>DEFINE_CLASS_WITH_UNIQUE_NAME
A>{
A>    ...
A>    тут нельзя написать конструктор потому что мы не знаем имя класса
A>};
A>

A>или
A>
A>DEFINE_CLASS(Foo)
A>{
A>    ...
A>    DEFINE_CTOR(Foo) // тут опять надо зачем-то писать имя класса 
A>    {
A>        ...
A>    }
A>};
A>


Это еще почему? Что за генерация такая, что имя класса известно, а конструктор нельзя объявить?
А как тогда планируется в вызывающем коде создавать оюъект методом ctor() ?
Re[5]: Определение, вызов
От: Qbit86 Кипр
Дата: 07.04.11 13:09
Оценка: +1
Здравствуйте, blackhearted, Вы писали:

Q>>>Топикстартер предоставил синтаксис определения, а не вызова. Вызов, я так полагаю, по прежнему будет new MyClass(params).


B>а смысл писать вдобавок методы типа ctor()/this() , если всё равно будет вызываться new MyClass() ???


Чтобы избежать избыточности (и всех её негативных последствий) в определении класса.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Способ именования конструкторов и деструкторов
От: blackhearted Украина  
Дата: 07.04.11 13:10
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, DarkGray, Вы писали:


DG>>чтение кода с любого места в произвольном направлении (обычно конфликтует с критерием дублирование информации)

A>1. ИДЕ должна показывать текущий контекст
A>2. та же проблема с методами — смотришь на метод, и не видишь чей он.

всегда только IDE?
Можно вообще уйти от фиксированных имён и аннотировать методы.
Что-то типа @Constructor. Тогда без IDE будет полный пипец. А такие ситуации довольно часты.
Re[6]: Определение, вызов
От: blackhearted Украина  
Дата: 07.04.11 13:12
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, blackhearted, Вы писали:


Q>>>>Топикстартер предоставил синтаксис определения, а не вызова. Вызов, я так полагаю, по прежнему будет new MyClass(params).


B>>а смысл писать вдобавок методы типа ctor()/this() , если всё равно будет вызываться new MyClass() ???


Q>Чтобы избежать избыточности (и всех её негативных последствий) в определении класса.


и какие негативные последствия у

public class A
{
   public A();
}


по сравнению с


public class A
{
   public ctor();
}


?
Re[3]: Способ именования конструкторов и деструкторов
От: Qbit86 Кипр
Дата: 07.04.11 13:14
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Это еще почему? Что за генерация такая, что имя класса известно, а конструктор нельзя объявить?


Имя класса как раз может быть неизвестно.

B>А как тогда планируется в вызывающем коде создавать оюъект методом ctor()?


Это уже задача вызывающего кода. Он независим от библиотечного. Объявление класса и создание его экземпляра — это слабосвязанные вещи, они могут быть разделены в пространстве и времени. Создание происходит не вызовом ctor(params), а вызовом SomeGeneratedClass(params).
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Способ именования конструкторов и деструкторов
От: Abyx Россия  
Дата: 07.04.11 13:17
Оценка:
Здравствуйте, blackhearted, Вы писали:

[]

не оверквотьте.
In Zen We Trust
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.