|
|
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Предположим, в сотнях программ на предприятии уже используется первая процедура hire_emp (с параметрами "имя сотрудника" и "номер сотрудника"). Пусть необходимо создать новые программы, требующие нового алгоритма (позволяющего задавать дополнительно значения параметров "дата приема на работу" и "зарплата"). Без перегрузки пришлось бы найти все вхождения существующей процедуры hire_emp и, соответственно, изменить код. За счет перегрузки новую версию с четырьмя параметрами можно добавить без проблем — новые приложения будут использовать ее, а существующие программы смогут по-прежнему использовать версию с двумя параметрами. Не проще ли создать процедуру с новым именем и использовать ее в новых программах? Приведите пожалуйста пример, в котором использование перегрузки, ну просто необходимо на 110%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 14:09 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
alconНе проще ли создать процедуру с новым именем и использовать ее в новых программах? Нет, не проще. После того, как такая ситуация случится три-четыре раза, у проектной команды мозги расплавятся помнить, процедура с каким именем соответствует какой ситуации и каким параметрам. alconПриведите пожалуйста пример, в котором использование перегрузки, ну просто необходимо на 110%. Примера "необходимо" нет и быть не может. А вот примеров "удобно" - сколько угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 15:11 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Представь, что у тебя есть 10 типов, все эти 10 типов необходимо приводить в строку String toString(один из 10 типов) {} Без перегрузки тебе бы пришлось писать 10 методов с разными именами и вызывать для каждого типа, а с перегрузкой у тебя будет 1 метод и 10 реализаций под каждый тип И тебе не нужно будет париться - вспоминать какой из 10 типов нужен для конкретного типа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 16:29 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Cpt. GrayПредставь, что у тебя есть 10 типов, все эти 10 типов необходимо приводить в строку String toString(один из 10 типов) {} Без перегрузки тебе бы пришлось писать 10 методов с разными именами и вызывать для каждого типа, а с перегрузкой у тебя будет 1 метод и 10 реализаций под каждый тип И тебе не нужно будет париться - вспоминать какой из 10 типов нужен для конкретного типаГлупости какие. От начала и до конца. Во первых, будь точен в словах: Без перегрузки ты будешь писать десять функций с разными именами и параметрами. С перегрузкой ты будешь писать десять функций с разными параметрами и общим именем. Во вторых, париться тоже не нужно. Ты всегда с легкостью вспомнишь что IntToString() это конвертация из int, а DoubleToString() это конвертация из double. И так для всех десяти типов. Так что жить без перегрузки можно с легкостью и без единой проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 17:40 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
White OwlТак что жить без перегрузки можно с легкостью и без единой проблемы. На этом месте я всегда рассказываю классическую историю. Когда-то, в самом начале своей работы стажёром в некоей конторе, я написал функцию, которая выполняла SQL-запрос и возвращала его результат. И назвал её Select. Потом я добавил к ней параметр, который указывал, какой connection использовать для выполнения запроса. В полном соответствии с ходом мысли топикстартера, я назвал её ESelect - мол, "развитая". И пожив так немного, я вдруг понял, что когда мне потребуется в следующий раз доработать функцию, я не смогу придумать для неё имени лучше, чем FSelect. Вот в этот момент я понял, зачем нужна перегрузка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 17:49 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
White Owlпариться тоже не нужно. Ты всегда с легкостью вспомнишь что IntToString() это конвертация из int, а DoubleToString() это конвертация из double. И так для всех десяти типов.а потом ты поменяешь тип у переменной с int на double и пойдёшь ходить по всей кодовой базе проекта, переименовывая все места, где ты эту переменную конвертишь в строку. "с легкостью и без единой проблемы." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 18:21 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Во многих языках жили и живут без перегрузки и никто не страдает. Хотя, конечно, вещь удобная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 18:42 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
В некоторых яызках где нет перегрузки, есть "необязательные" параметры. Тоже удобно, но правда менее производительнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 21:39 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
egorychWhite Owlпариться тоже не нужно. Ты всегда с легкостью вспомнишь что IntToString() это конвертация из int, а DoubleToString() это конвертация из double. И так для всех десяти типов.а потом ты поменяешь тип у переменной с int на double и пойдёшь ходить по всей кодовой базе проекта, переименовывая все места, где ты эту переменную конвертишь в строку. "с легкостью и без единой проблемы."Во первых, я так понимаю что ни про sed, ни про функции рефакторинга в виндообразных редакторах ты не слышал? Во вторых, а зачем менять тип переменной? Предположим уже есть большой проект (достаточно большой чтоб рефакторинг был посложнее). И в этом проекте есть переменная одного типа и тебе ВДРУГ захотелось сделать ее другого типа??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 22:28 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
softwarerWhite OwlТак что жить без перегрузки можно с легкостью и без единой проблемы. На этом месте я всегда рассказываю классическую историю. Когда-то, в самом начале своей работы стажёром в некоей конторе, я написал функцию, которая выполняла SQL-запрос и возвращала его результат. И назвал её Select. Потом я добавил к ней параметр, который указывал, какой connection использовать для выполнения запроса. В полном соответствии с ходом мысли топикстартера, я назвал её ESelect - мол, "развитая". И пожив так немного, я вдруг понял, что когда мне потребуется в следующий раз доработать функцию, я не смогу придумать для неё имени лучше, чем FSelect. Вот в этот момент я понял, зачем нужна перегрузка И? В чем смысл твоей истории? Написал одну функцию, написал ее улучшенную версию, испугался что в будущем напишешь еще и третью версию и решил сменить свой стиль. Да, забавная байка. Но как это сочетается с темой о перегрузке функций я не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 22:35 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
alcon, Небходимости нет. Есть возможность. Это как сложносочиненное предложение, т.е. можно и без него, но иногда мысль донести с его помощью проще. Если функции семантически близки и имеют похожие сигнатуры, то почему бы и не обозвать их одинаково. Короче, главное, чтобы было понятно и просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 01:20 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
alconНе проще ли создать процедуру с новым именем и использовать ее в новых программах?А конструктор класса? У него имя поменять нельзя. Разрушил всю ООП парадигму :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 01:48 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
alconПриведите пожалуйста пример, в котором использование перегрузки, ну просто необходимо на 110%.Привел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 02:01 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Relic HunterА конструктор класса? У него имя поменять нельзя. Ну, в нормальных языках можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 07:49 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Я много работаю с интерфейсами (front-end), в частности в WPF. Так как делать контрол с 0 просто глупо, а WPF для того и создан, чтоб мне не пришлось описывать поведение контролов с 0ля, я часто применяю перегрузку методов. Когда мне надо изменить поведение существующего контрола, внести изменения в компоновку на форме, добавить новой визуализации через рендеринг, а не через шаблоны, в моделях представлениях где тоже есть масса абстрактных и базовых классов это крайне полезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 09:20 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Roman Mejtes Когда мне надо изменить поведение существующего контрола, внести изменения в компоновку на форме, добавить новой визуализации через рендеринг, а не через шаблоны, в моделях представлениях где тоже есть масса абстрактных и базовых классов это крайне полезно.Только это не перегрузка, а переопределение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 10:57 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
alconПриведите пожалуйста пример, в котором использование перегрузки, ну просто необходимо на 110%. 1. поддержка старых АПИ, когда основной код пишется внешними пользователями 2. при реализации устоявшихся формул (н-р, математических) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 11:45 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
White OwlВо первых, я так понимаю что ни про sed, ни про функции рефакторинга в виндообразных редакторах ты не слышал?спор ради спора. Ты же не можешь не понимать, что при наличии перегруженной функции тебе не потребуется ни sed, ни функция рефакторинга, просто поменял тип, и вуаля - всё работает, как должно. White OwlВо вторых, а зачем менять тип переменной? Предположим уже есть большой проект (достаточно большой чтоб рефакторинг был посложнее). И в этом проекте есть переменная одного типа и тебе ВДРУГ захотелось сделать ее другого типа???вдруг-не вдруг, причин может быть миллион, начиная от банальной ошибки кодирования и заканчивая уточнением знаний о предметной области. Не верю, что у тебя ни разу такого кейса не было. P.S. Я, конечно, понимаю, что раз в Си нет перегрузки, то она никому не нужна ))) Просто поверь, что её наличие бывает удобным. Не будь ретроградом ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 12:52 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
alconПерегрузка процедур и функций. Зачем? что бы программист не гадал "как же они назвали это?", а программировал интуитивно, близко к языку (английскому, например). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 12:59 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
softwarerSelect ... ESelect ...FSelec вот вот. А если программист не один, то скоро дойдём до XSelect_12_5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 13:00 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
alconНе проще ли создать процедуру с новым именем и использовать ее в новых программах? Приведите пожалуйста пример, в котором использование перегрузки, ну просто необходимо на 110%. Все лингвистические извращения возможности программирования, начиная вообще от создания компиляторов, хотят одного: решить задачу, набирая поменьше символов, но получая бОльшую ясность и надежность. Новые процедуры вида hire_emp_ex, hire_emp_new, hire_emp_from_date_income_and_salary_с_блекджеком_и_шлюхами могут затуманивать суть простейших алгоритмов и плодят сущности без необходимости. За такими маньяк Оккам с бритвой гонялся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 13:03 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
Кстати, далеко не всегда перегрузка нужна и полезна, я считаю. Перегрузка даёт гибкость, но повышает неопределённость. Там где это нужно, в языках типа С++, это полезно. Там существуют сотни или тысячи функций и процедур, так что сочинять имена функций типа CreateAccountOnExistingUserWithoutAuthenticationAndSettingDefautProfile, да ещё так, чтобы не пересекалось с уже существующими функциями неинтересно. Другое дело, например, Oracle PL/SQL. Там функции и процедуры крупные, их мало, и выдумать имя новой функции достаточно просто. А недавно был случай, когда мне пришлось отказаться от перегрузки имени процедуры и сознательно изменить имя: перегруженная процедура вызывалась из клиента, который не мог передавать параметры типизированными, и передавал их в виде строк. А перегрузка была именно по типу параметров -- в одной процедуре параметры были строковые, в другой -- числовые. Я был бы непротив, если бы перегрузки в PL/SQL не было бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 16:14 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
MasterZivДругое дело, например, Oracle PL/SQL. Там функции и процедуры крупные, их мало, и выдумать имя новой функции достаточно просто. Его выдумать всегда просто, но точно так же не всегда удобно. "Крупные, их мало" - говорит лишь о чьём-то стиле программирования. Я, например, в своё время возился с приложением на Cи, в котором типовая функция состояла из нескольких тысяч строк и размещалась каждая в одноимённом файле (то есть, соответственно, имя функции могло быть не больше восьми символов). Но мне было бы глупо на этом основании говорить, что в Си мало функций, они крупные и выступать за восьмисимвольное ограничение идентификаторов. MasterZivА недавно был случай, когда мне пришлось отказаться от перегрузки имени процедуры и сознательно изменить имя: перегруженная процедура вызывалась из клиента, который не мог передавать параметры типизированными, и передавал их в виде строк. А перегрузка была именно по типу параметров -- в одной процедуре параметры были строковые, в другой -- числовые. Я был бы непротив, если бы перегрузки в PL/SQL не было бы. Классический случай того, что я называю однозвенным мышлением. "Проблема в кривом клиенте - поэтому давайте изменим сервер". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 16:22 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
softwarerКлассический случай того, что я называю однозвенным мышлением. "Проблема в кривом клиенте - поэтому давайте изменим сервер". и придумали тип variant :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 17:11 |
|
||
|
Перегрузка процедур и функций. Зачем?
|
|||
|---|---|---|---|
|
#18+
egorychWhite OwlВо вторых, а зачем менять тип переменной? Предположим уже есть большой проект (достаточно большой чтоб рефакторинг был посложнее). И в этом проекте есть переменная одного типа и тебе ВДРУГ захотелось сделать ее другого типа???вдруг-не вдруг, причин может быть миллион, начиная от банальной ошибки кодирования и заканчивая уточнением знаний о предметной области. Не верю, что у тебя ни разу такого кейса не было.Не было, ни разу. Ошибки кодирования обнаруживаются еще на этапе первой компиляции (кстати перегрузка функций спрячет эту ошибку и ты получишь уже неправильную логику работы). Уточнение знаний о предметной области может заставить поменять очень много вещей внутри программы. Перегрузка функций на этом фоне сможет спасти только доли процента от общей работы. egorychP.S. Я, конечно, понимаю, что раз в Си нет перегрузки, то она никому не нужна ))) Просто поверь, что её наличие бывает удобным. Не будь ретроградом ;)Я не спорю с тем что это бывает удобным. Но удобность и нужность это очень разные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2015, 17:29 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39002274&tid=1340979]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
292ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 631ms |

| 0 / 0 |
