Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Язык программирования Си#: критическая оценка 
:(
    Опции темы
Medved
Дата 21.12.2004, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Язык программирования Си#: критическая оценка

Сергей Свердлов


ОГЛАВЛЕНИЕ
Избыточность
Побочный эффект
Тяжеловесность
Читать или писать?
Перспективы Си#

Избыточность

Некоторые средства языка Си# являются избыточными — в том смысле, что не добавляют к языку никаких функциональных возможностей, а лишь позволяют в иной форме записать то, что и так может быть выражено достаточно просто.

К числу таких средств относятся свойства (properties) и индексаторы (indexers).

Свойства маскируют обращение к процедуре (методу) под обращение к переменной (полю).

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

При использовании свойств для выполнения обоих этих действий достаточно свойству присвоить значение.

Пусть строковое (типа string) свойство Title экранных объектов класса Element задает надпись-заголовок таких объектов. Объявление этого свойства может выглядеть так: public class Element {

string title; // Это поле

public string Title { // А это - свойство

get { return title;}

set {

title = value;

Repaint(); // Перерисовать

}

}

// Далее определяются другие поля и методы

...

}

Сама надпись хранится в поле title, а свойство Title организует доступ к нему c помощью подпрограмм get (получить) и set (установить). Если e — переменная, обозначающая объект класса Element, то для изменения надписи и перерисовки объекта на экране достаточно записать: e.Title = “Привет”;

Такое присваивание приводит к выполнению подпрограммы set. А, например, при выполнении оператора, добавляющего к заголовку восклицательный знак: e.Title += “!”; неявно вызываются и get, и set.

Между тем доступ к заголовку экранного элемента может быть оформлен и без использования свойств: public class Element {

string title;

public string getTitle() {

return title;

}

public void setTitle( string value ) {

title = value;

Repaint(); // Перерисовать

}

// Далее определЯютсЯ другие полЯ и методы

...

}

В этом случае вместо e.Title = “Привет”; нужно записать e.setTitle(“Привет”); а взамен e.Title += “!”; необходимо использовать e.setTitle(e.getTitle()+“!”);

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

От него не скрывается тот факт, что изменение заголовка выполняется подпрограммой, которая кроме присваивания значения может выполнить и другие действия. В первом же случае по тексту программы невозможно (без обращения к описанию класса Element) отличить использование свойств от использования обычных полей.

Программирование в среде визуальных систем, подобных Delphi, откуда в язык Си# перекочевали свойства, можно разделить на несколько уровней. Первый — разработка прикладных программ. В этом случае программист, создавая программу с графическим интерфейсом пользователя, как правило, оперирует лишь готовыми компонентами с уже запрограммированными свойствами.

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

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

Второй уровень — разработка визуальных компонентов. Здесь на программиста возлагается полная ответственность за корректность создаваемой системы классов.

Наконец, следует рассмотреть использование языка, оснащенного свойствами, вне контекста визуальной среды*.

В этой ситуации, то есть в общем случае, когда свойства применяются не только для визуальных элементов, неотличимость вызова подпрограмм (get и set) от обращения к полю может сослужить плохую службу, снизив возможность понимания программы. По ее тексту уже нельзя понять, сводится ли действие лишь к изменению или получению значения поля, либо оно сопряжено с выполнением и других операций.

Весьма неоднозначный смысл имеет конструкция Си#, называемая индексатором. Индексаторы — это элементы классов (а также интерфейсов и структур), позволяющие обращаться к объектам как к массивам (указанием индекса в квадратных скобках). Реализуется такой доступ неявно вызываемыми подпрограммами get и set.

Например, обращение к отдельным битам 32-разрядного целого значения (bits) можно замаскировать под обращение к логическому массиву. Для этого создается такое описание (в данном случае структуры): public struct BitSet {

int bits; // Поле целого типа

public bool this[int i] { // Индексатор

get{return 0<=i && i<32? (bits & 1<

set {

if(i<0 || i>31) return;

if(value) bits |= 1<

}

}

}

Теперь использование переменной типа BitSet может выглядеть, например, так:

BitSet b = new BitSet(); // Описание переменной

...

// Все биты устанавливаются в единичное значение

for (int i=0; i<32; i++ )

b[i] = true;

...

if(b[i]) ( // Проверка i-го бита

...

В описании типа BitSet использовано много специфических обозначений: && — условное “И”; & — поразрядное логическое “И”; << — сдвиг влево; != — не равно; ... ? ... : ... — условная операция, если логическое выражение перед “?” истинно, то результат операции вычисляется по выражению, записанному перед двоеточием, если нет — по выражению, записанному после двоеточия; || — поразрядное логическое “ИЛИ”; |= — присваивание с поразрядным “ИЛИ” (обратите внимание на схожесть с !=); &= — присваивание с поразрядным “И”; ~ — поразрядное “НЕ”. Идентификатор value представляет значение, переданное подпрограмме set.

Конечно, те же функциональные возможности могут быть обеспечены и без индексаторов: public struct BitSet {

int bits;

public bool get(int i) { // Получить

return 0<=i && i<32? (bits & 1<

}

public void set(int i, bool value) { // Установить

if(i<0 || i>31) return;

if(value) bits |= 1<

}

}

Обратите внимание, что содержание подпрограмм get и set нисколько не изменилось. Только теперь это обычные методы. Для доступа к отдельным битам квадратные скобки уже не применить:

BitSet b = new BitSet(); // Описание переменной

...

// Все биты устанавливаются в единичное значение

for (int i=0; i<32; i++ )

b.set(i, true);

...

if(b.get(i)) ( // Проверка i-го бита

...

По-видимому, одной из причин появления индексаторов в Си# было желание создателей языка естественным образом оформить обращение к символам строк, которые в Си# являются объектами, но не массивами. Если s — строка (string), то только благодаря наличию в классе string индексатора i-й символ строки s можно обозначить s[i].

В языке Java, где строки — тоже объекты, для обращения к отдельному символу приходится вызывать специальный метод: s.charAt(i).

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

Преимущество обнаруживается одно: упрощение нотации. Действия по доступу к объекту и его изменению записываются как обращение к полю в случае использования свойств и как обращение к элементу массива при использовании индексаторов.

Недостатков можно назвать больше:

* усложняются язык и компилятор. С появлением свойств и индексаторов возникает много новых правил. В справочнике по Си# свойствам посвящено целых восемь страниц;

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

Например, использование индексатора для доступа к элементам линейного списка по их номеру** при значительной длине списка гораздо менее эффективно, чем обращение к элементу массива, хотя выглядит так же. Применение такого индексатора для последовательного просмотра списка — и вовсе абсурд, к которому, тем не менее, вас подталкивают;

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

Приведу пример, когда простейший фрагмент, работа которого в иных обстоятельствах понималась бы абсолютно однозначно, а при использовании Си# совершенно непредсказуема:

int i, s=0;

for (i=1; i<=100; i++ ) a[i]=i;

for (i=1; i<=100; i++ ) s += a[i];

System.Console.WriteLine(s);

Ну и что тут такого? Вначале элементам “a” поочередно присваиваются значения первых ста чисел натурального ряда: 1, 2, 3, ..., 99, 100. Затем вычисляется и выводится сумма этих чисел, которая обязательно должна быть равна 5050. Но ничего подобного! Напечатанное этой программой значение может оказаться каким угодно. Например, равным 338 350, если “a” — индексируемый объект такого типа: class Array {

public int this[int i]{

get{ return i*i; } // i-е значение равно i*i

set {} // Никаких действий

}

}

* Для языка Объектный Паскаль, который используется в Delphi, такое применение не слишком актуально. Это специфический язык конкретной системы визуального программирования. Однако язык Си#, по-видимому, претендует на всеобщность, на существование не только в рамках конкретной среды.

** Именно этим примером иллюстрируется использование индексаторов в документации по Си#.

Источник: http://www.pcweek.ru/?ID=56351


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
arilou
Дата 21.12.2004, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Pegas @ 21.12.2004, 12:13)
В этой ситуации, то есть в общем случае, когда свойства применяются не только для визуальных элементов, неотличимость вызова подпрограмм (get и set) от обращения к полю может сослужить плохую службу, снизив возможность понимания программы. По ее тексту уже нельзя понять, сводится ли действие лишь к изменению или получению значения поля, либо оно сопряжено с выполнением и других операций.

Ну и бредятина, честно говоря. Свойства для того и сделаны (помимо всего прочего), чтобы дать возможность программисту внести логику на присваивание значения, и на его получение - простой пример - Lazy Load. И слова о том, что это ухудшает читабельность программы, по меньшей мере, спорны.

Цитата(Pegas @ 21.12.2004, 12:13)
По-видимому, одной из причин появления индексаторов в Си# было желание создателей языка естественным образом оформить обращение к символам строк, которые в Си# являются объектами, но не массивами. Если s — строка (string), то только благодаря наличию в классе string индексатора i-й символ строки s можно обозначить s[i].

Еще один маразм. А как насчет обращения к hashtable по ключу? Человек явно не понимает, или, что более вероятно, не видит в силу закоснелости, удобных нововведений.

Цитата(Pegas @ 21.12.2004, 12:13)
Ну и что тут такого? Вначале элементам “a” поочередно присваиваются значения первых ста чисел натурального ряда: 1, 2, 3, ..., 99, 100. Затем вычисляется и выводится сумма этих чисел, которая обязательно должна быть равна 5050. Но ничего подобного! Напечатанное этой программой значение может оказаться каким угодно. Например, равным 338 350, если “a” — индексируемый объект такого типа

Приводить пример использования без объявления (до самого примера) типа переменной "a" - очень интересный подход. Может, он и программы так же пишет? smile

В общем, ерунда какая-то. Статья пуриста от программирования.

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

Это сообщение отредактировал(а) arilou - 21.12.2004, 12:40


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Medved
Дата 21.12.2004, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Ок. Интересно было услышать мнение учатсников. Собственно для этого и постил.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Sardar
Дата 21.12.2004, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Привык к полям(гетеры/сетеры) и индексному обращению из JS, для меня это привычно и удобно(индексы). Замаскированные Гетеры/сетеры действительно могут вести к неясному и не эффективному коду. Но как говорится не можешь держать ружьё - не ходи на охоту. Количество ошибок зависит от програмиста.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
arilou
Дата 21.12.2004, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Sardar @ 21.12.2004, 17:32)
Но как говорится не можешь держать ружьё - не ходи на охоту. Количество ошибок зависит от програмиста.

Хорошо сказано smile


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
bel_nikita
Дата 22.12.2004, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



Туфта полная.
Неужили это и в самом деле в журнале печаталось?
Что-то автор, похоже, не очень в программировании...


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Medved
Дата 22.12.2004, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Я согласен - что статья плод закостенелого программиста, привыкшего с привычному. Судит только со своей колокольни.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
bel_nikita
Дата 22.12.2004, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



Я бы сказал по-другому: Плохому танцору - известно, что мешает smile
Цитата
Приведу пример, когда простейший фрагмент, работа которого в иных обстоятельствах понималась бы абсолютно однозначно, а при использовании Си# совершенно непредсказуема:
Становиться понятно, что человек не знаком с перегрузкой операторов


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Medved
Дата 22.12.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Цитата(bel_nikita @ 22.12.2004, 15:19)
Становиться понятно, что человек не знаком с перегрузкой операторов

После дельфи я от этой возможности просто тащюсь!


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
DENNN
Дата 22.12.2004, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: нет
Всего: 43



Я согласен с той мыслью в статье, что маскирование под свойствами вызова функций может приводить к неоднозначности в сложных проектах. Гораздо надежней всегда четко понимать, что происходит: вызывается функция или изменяется значение переменной.
Перегрузка же операторв хороша в тех случаях, для которых она изадумывалась. Например для класса вектора перегрузить операцию умножения и скалярного умножения. Перегружать же операции там где это не требуется - ИМХО, плохой стиль программирования.
PM ICQ   Вверх
Medved
Дата 22.12.2004, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Цитата(DENNN @ 22.12.2004, 16:41)
Перегружать же операции там где это не требуется - ИМХО, плохой стиль программирования.

Ну не знаю. Спорно. Возникают порой такие случаи, например, когда мне необходимо выполнить сложение полей данных, n-го количества экземпляров одного пользовательского класса.

Цитата(DENNN @ 22.12.2004, 16:41)
Я согласен с той мыслью в статье, что маскирование под свойствами вызова функций может приводить к неоднозначности в сложных проектах. Гораздо надежней всегда четко понимать, что происходит: вызывается функция или изменяется значение переменной.


Тоже спорно. Просто надо разумно использовать префиксы и давать нормальные названия пользовательским элементам.
Добавлено @ 14:10
Коментарии к статье почитайте:
http://www.pcweek.ru/?ID=56351&Discuss=1&M...#Message_108747


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Sardar
Дата 22.12.2004, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



На мой взглят перегузка операторов это одна из самых больших ошибок, которые когда либо придумывали.
Цитата(Pegas @ 22.12.2004, 13:05)
Просто надо разумно использовать префиксы и давать нормальные названия пользовательским элементам.

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Medved
Дата 22.12.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Цитата(Sardar @ 22.12.2004, 18:09)
На мой взглят перегузка операторов это одна из самых больших ошибок, которые когда либо придумывали.
Цитата(Pegas @ 22.12.2004, )
Просто надо разумно использовать префиксы и давать нормальные названия пользовательским элементам.

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

ИМХО это поверхностное суждение и в корне неправильное, я бы даже сказал непрофессиональное. Весь мой опыт реального программирования (и не только мой) говорит о том что это только улучшает читабельность кода. А это в свою очередь приводит к меньшему количеству ошибок. Не обжайся пожалуйста на мои слова, докажи реальными примерами, что я не прав. А голословно оговорить что-то, все могут.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
bel_nikita
Дата 22.12.2004, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



Цитата
На мой взглят перегузка операторов это одна из самых больших ошибок, которые когда либо придумывали.
Упс... Нифига. Перегрузка операторов - это супер. Разве плохо и неудобно складывать/вычитать/умножать/делить, например, объекты одной строкой?

Код

Object ob1;
Object ob2;
Object ob3;
ob3 = ob1 + ob2; // разве это плохо?
И мне абсолютно пофиг, что там делается за этим + и =. Да и знать не надо. А если не уверен в + и =, то тогда вообще не следует пользоваться Object'ом, а изобретать свой велосипед.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Sardar
Дата 22.12.2004, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(Pegas @ 22.12.2004, 14:23)
ИМХО это поверхностное суждение и в корне неправильное, я бы даже сказал непрофессиональное.

Ну моё утверждение тоже было мое ИМХО smile Просто у меня всегда появляется недоверие, когда вижу "простые" выражения в С++, сразу хочется раскопать, что же делается на самом деле. Это сбивает с толку, а вызовы методов выглядят ясно. По любому я рад что в Java нет этой возможности.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Medved
Дата 22.12.2004, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



регресс.
Цитата(Sardar @ 22.12.2004, 19:31)
По любому я рад что в Java нет этой возможности.

будет.... в следующе версии.... не в следующей, так в последующей. Или будет что-то типа такого.

ИБО это очень удобный и правильный механизм. Его не зря в C# добавили.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Domestic Cat
Дата 1.1.2005, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Цитата(Pegas @ 22.12.2004, 07:56)
будет.... в следующе версии.... не в следующей, так в последующей. Или будет что-то типа такого.


Эту фичу пытались добавить в 1.5; дело в том что в Java сообществе любой человек может высказать свои пожелания к следующей версии, после чего решают добавлять или нет. В результате не добавили.

Лично я никакой крутизны в перегрузке операторов не вижу. Глубоко в нас сидит коечно восприятие "кульности" такой перегрузки; по крайней мере уменя оно сидит со времен 386 и Паскаля.

Так вот, каковы конкретно преимущества ?
1. Работать проще (заметьте, экономии места нет, скомпилируется все равно одинаково).

... и все.
Объясню: как часто оно надо? Скажем приложение клиент-сервер - куда совать эту перегрузку?
Или ХМЛ редактор? Ну ладно, пару мест можно найти, и то с натяжкой.
В основном это надо в приложениях, где идет работа с определенными юзером типами данных, причем специфическая - типа комплексных чисел.
Тогда да, удобнее писать
Код

c1 + c2 + c3 + c4

чем
Код

с1.add(c2.add(c3.add(c4)));


Недостатки:
1. Неясный код.
Предположим мы видим
Код

date++;


Вопрос - что сие означает? Да все что угодно. Ьожет, действительно идет приращение поля объекта. (какого тогда? - часы, минуты, секунды? года?) Нужно смотреть код и выяснять. Гораздо понятнее было бы
Код

date.addHours(1);

Набирать больше, но зато все понятно.

Тоже все, ИМХО.
Думаю, ни на Java, ни на С# никто мат библиотек писать не будет (из-за потери эффективности)
потому "против" для меня перевешивает аргументы "за".


--------------------

PM   Вверх
Sardar
Дата 1.1.2005, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Согласен с Domestic Cat, перегрузка операторов сбивает с толку, по крайней мере меня.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sun
Дата 4.1.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



Еще один минус перегрузки операторов в C# - то что не все языки .Net ее поддерживают и в рекомендациях предлагается дублировать все перегруженные операторы обычными методами, что сводит удобность операторов на нет.


--------------------
Account removed
PM MAIL   Вверх
Kurt
Дата 4.1.2005, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



Вот меня всегда удивляло, почему программеры ругают некоторые НЕОБЯЗАТЕЛЬНЫЕ К ПРИМЕНЕНИЮ средства языка. Ну, блин, если нравится использовать переруженные операторы - используй, нет - не используй. Это личное дело каждого, зачем же ругать создателя?


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
arilou
Дата 4.1.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Kurt @ 4.1.2005, 14:56)
Ну, блин, если нравится использовать переруженные операторы - используй, нет - не используй. Это личное дело каждого, зачем же ругать создателя?

Тут еще надо учитывать договоренность в команде


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
[Last]Wizard
Дата 4.1.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.7.2004
Где: Минск, Беларусь

Репутация: 4
Всего: 10



Цитата(Kurt @ 4.1.2005, 14:56)
Это личное дело каждого, зачем же ругать создателя?

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

PM ICQ   Вверх
Sun
Дата 4.1.2005, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



Очень был удивлен наличием указателей в C#. Правда их использование там достаточно усложненно и не совсем понятно чем было продиктовано их введение.


--------------------
Account removed
PM MAIL   Вверх
Coresh DRAW!
Дата 2.2.2005, 14:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











а) Насчет свойств. Свойства - вещь рульная и, несомненно, полезная. Я согласен с автором, что они иногда вводят программиста в заблуждение, однако я не согласен с тем, что он обвиняет в этом именно их. Виноваты не свойства, а соглашение о наименованиях в стиле Pascal. Именно благодаря ему нельзя разобраться, где у тебя метод, где поле, где свойство а где константа. Если бы ребята из мелкософт выбрали бы более удобное соглашение о наименованиях, например, как в Java, и/или договорились бы ставить перед свойствами знак подчеркивания, этого можно было бы избежать.
б) Насчет индексаторов. Опять таки вещь нужная. Вот только когда я столкнулся с кодом mess["first"] = "The first", я подумал о том, что лучше было бы пользоваться методом put("first", "The first") а индексаторы оставить для того, чтобы можно было обращаться с объектами, как с массивами, т.е. только через целочисленный индекс. На худой конец, можно было сделать дополнительный индексатор для объектов, но с круглыми скобками. Выражение mess("first") = "The first" меня лично не сбивает с толку. Хотя это на любителя. В конце-концов, привыкнуть не проблема.

Вот о чем автор не говорил, а стоило бы, так это об избыточности некоторых служебных слов. Например слово struct вещь явно лишняя, т.к. среда исполнения и сама может догадаться, что если в классе используются только данные примитивных типов, то его объекты лучше размещать в стеке. Так же явно избыточной является возможность перегрузки операции приведения типов. Гораздо логичнее, читабельнее и проще пользоваться методами toXXX(). Ведь никто не станет пользоваться выражением string s = (string) obj вместо string s = obj.toString().

А по большому счету, все эти дискуссии - только потеря времени. Не нравится - придумывай свой язык. Все равно трепотня ничего не изменит.
  Вверх
chipset
Дата 2.2.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 1
Всего: 165



Цитата(Sun @ 4.1.2005, 08:37)
Очень был удивлен наличием указателей в C#. Правда их использование там достаточно усложненно и не совсем понятно чем было продиктовано их введение.

Совместимостью с С++ программистами? smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ivashkanet
Дата 10.1.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Во чё раскопал  smile 

А что сейчас мы об этом думаем?

ИМХО, все выше перечисленное (свойства, индексаторы, перегрузка) очень полезные вещи.
Но все нужно использовать с умом. 
А при небольшом желании можно многое извратить smile 



Цитата(Medved @  21.12.2004,  11:13 Найти цитируемый пост)
public int this[int i]
{
get{ return i*i; } // i-е значение равно i*i
set {} // Никаких действий
}

Руки оторвать такому програмисту надо.
А чтобы изменилось, если бы мы написали:
Код

public int GetElementByNumber(int i)
{ return i*i;};

Это типа нормально?
Смысл ведь тот же  smile 

Перегрузка:
Перегрузка должна подчинятся одним и тем же законам (исходя из назначения метода) и соответствовать названию метода.
Пользоваться ей так же нужно с умом smile
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 10.1.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(chipset @  2.2.2005,  15:12 Найти цитируемый пост)
Совместимостью с С++ программистами?

Операции над памятью с пом. указателей быстрее по сравнению с работой над массивами, т.к. нет оверхеда на проверку выхода за пределы. Так что если хочется выжать из шарпа полную производительность при обработке простых массивов данных - пользуемся unsafe, stackalloc и указателями  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 10.1.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



mr.DUDA, осторожно, теме 2  smile года  smile 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 10.1.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Не заметил.  smile 

ivashkanet, гробокопатель !


--------------------
user posted image
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.