Функции.....шаг первый. Вступление....непонимание

В этом форуме автор намерен рассказывать о своём нелегком пути становления программистом.

Модератор: SLIM

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 03.09.2008 (Ср) 21:37

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

И так функции бывают разные. Еще на поре простого и спользования процедур и функций даже стандартный MsgBox
казался нреальным (да и сейчас я мало понимаю как он работает) . Первое что удевляло меня так это необязательные параметры. Это первый камень преткновения. Только через время я знал что для этого нужно всего лишь написать простое понятное слово Optional т.е. для меня эти показалось (судя поназванию) "опцией" функции или процедуры. Т.е. используя "опцию" можно направить работу ф-ии в нужное русло. Делалось это конечно элементарным if...then....else.
Паразительным было то, что использовать необязательные параметры процедуры (когда я дальше буду говорить процедуру, то буду подразумевать и ф-ю, т.к. ф-я это как мне кажется процедура, возвращающая значение, а не только
что-то выполняющая, причем это значение строго типизировано).

Так вот необязательные параметры процедуры
неудобно использовать для значений кроме булевых, т.к. в теле процедуры приходилось очень сильно "ветвить" условия

Это хорошо когда программер используя данную процедуру, указывает в необязательном параметре True или False по
поводу замены файла, при копировании например (строго сию секунду придуманный пример). А если допустим нужно при указании в "опции" 1 - файл сохраняется без замены, 2 - файл заменяется при сохранении, 3 - файл сохраняется при замене но в иное место (для этого видимо понадобится дополнительная опция "Куда сохранять", а потом, видимо в теле
процедуры проверять чтобы эту "обязательно указали")....и т.д.

Т.е. при указании опции небулевого значения рискую что-то да пропустить, не продумать и т.д. (не дай боже потом
переделать).

Двигаемся дальше. Добрые друзья-советчики подсказали (хотя по идее не нужно это подсказывать, это надо знать ибо
не знать это - стыдно) это конечно Enum. Ну ООООООчень удобная вещь. Очень приятная. Помню с каким удовольствием я использовал ф-ии с Enum-ом. НО. Вот блин. В качестве типа там выступают Longo-вые значения. Т.е. если в Энуме указать стринговое значение например пути сохранения файла, то он конечно работать не будет. Хотя возможно уже опять таки в теле процедуры проверять через ветвление условия, а лучше всего через Select Case эти стринговые значения. Т.е. нам уже не нужно делать так
Код: Выделить всё
If Foo=1 then
        действия с условием 1
                 else
        if Foo=2 then
      действия с условием 2



Замечу действия то одни и те же. Как бы параметр этих действий разные. Т.е. что-то малозначимое меняется. Используя Enum этого можно избежать. Т.е. ввести на уровне процедуры переменную и с помощьй Select Case выдавать такой параметр, сторог определенный.

Спросите почему этого нельзя делать с "Optional"....можно, но тогда придется проверять на ошибки программиста. Т.е. например корректность указания пути сохранения (существование например диска F:\)....
Но Enum никак нельзя защить в саму процедуру. Его нужно определить до процедуры. Что конечно накладывает свой
отпечаток. Следующая проблема, пока не решенная - это выход более одного результата по функции. Т.е. по примеру того как действует Split, получающая массив из строк, образованных из начальной строки путем деления его по заданному символу.

Это только предстоит узнать. Но также еще до конца не понятно где и как можно использовать Enum-ы кроме моего
варианта, как часто их используют. Правильно ли я использую Optional. Есть ли что-то еще в процедурах, чего я не знаю. И например что делать если ф-я должна заполнять поля формы чем-то ( названий полей ф-я то не знает)

Эх, прочитав таким бредом показалось. :D
Пишите жизнь на чистовик.....переписать не удастся.....

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Денис » 04.09.2008 (Чт) 7:44

А знаешь ли ты такое, что в процедуру или функцию можно передавать аргументы, а потом работать с их изменившимися значениями (это работает при передаче аргументов по ссылке, которое прописано по умолчанию) Таким образом ты можешь организовать получение из процедуры несколько значений сразу. А из функции организовать получение нескольких значений и значение ошибки, как результат работы функции.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Proxy » 04.09.2008 (Чт) 8:31

Да, это удобство я давольно давно понял) А ещё хотел сказать про передачу значения самой функции. Не рационально создавать некоторый буфер, который учавствует во всяческих вычислениях, а потом присваивать функции его значение. Гораздо легче потом будет разобраться в коде, когда при вычислениях используется само значение функции, а не дополнительный излишний буфер.
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение alibek » 04.09.2008 (Чт) 14:01

Function func1() As String() — возвращает массив String.
Function func1() As Variant : ... : func1 = Array("1","2","3") — возвращает Variant, внутри которого массив.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение alibek » 04.09.2008 (Чт) 14:05

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

Чаще — рационально. Имена функций порой изменяются, и в этом случае его надо изменять только в двух местах.
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Proxy » 04.09.2008 (Чт) 14:22

Дело привычки видимо. Я как-то привык называть функцию соответственно её действию. И переименовывать не приходится. Но это видимо от стиля зависит тогда.
Follow the white rabbit.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение keks-n » 04.09.2008 (Чт) 16:18

А из функции организовать получение нескольких значений и значение ошибки, как результат работы функции.

Вообще-то в VB6 так ведёт себя любая функция на нём написанная
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 04.09.2008 (Чт) 16:29

keks-n писал(а):Вообще-то в VB6 так ведёт себя любая функция на нём написанная

Как?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 04.09.2008 (Чт) 20:41

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

Про передачу аргументов я слышал конечно. Но не сталкивался с проблемой различия между ByVal и ByRef. Как то Хакер приводил даже пример по этому поводу, но если честно в жизни(в программировании) мне это мало помогло. Написав ф-ю мне все равно было какой там по типу аргумент.
Но вот по поводу того что ты говоришь слышу впервые. Тут как-то немного не ясно. Аргументы то мы передаем один раз в процедуру. Когда они меняются то? Как отследить, работать с их изменениями. При втором и т.д. вызове чтоли? Если можно тут поподробнее, а я пока пороюсь на форуме и в летиратуре

Proxy
Да, это удобство я давольно давно понял) А ещё хотел сказать про передачу значения самой функции. Не рационально создавать некоторый буфер, который учавствует во всяческих вычислениях, а потом присваивать функции его значение. Гораздо легче потом будет разобраться в коде, когда при вычислениях используется само значение функции, а не дополнительный излишний буфер.


Ну и как поступить например с Enum в этом случае то?

alibek
Спасибо, но вопрос, нужно определять значение массива? Если да, то что делать если функция вернет не больше значений. И как потом обращаться к элементам массива, вовращаемых ф-ей.


keks-n
Вообще-то в VB6 так ведёт себя любая функция на нём написанная

Не понял. Как может себя вести ф-я, если я ей не скажу как реагировать на ошибку.....
Пишите жизнь на чистовик.....переписать не удастся.....

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Zenitchik » 04.09.2008 (Чт) 20:55

различия между ByVal и ByRef

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

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 04.09.2008 (Чт) 21:06

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

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Sebas » 05.09.2008 (Пт) 8:25

Zenitchik писал(а):
различия между ByVal и ByRef

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


ой ёй ёй, а если переменная объект, то как быть с ByVal? Чем они будут отличаться?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Денис » 05.09.2008 (Пт) 9:55

SLIM писал(а):Если можно тут поподробнее

Код - лучшее объяснение!
Код: Выделить всё
Private Sub Form_Load()

Dim A As Long
A = 32

Debug.Print A
Test A
Debug.Print A

End Sub
'_________________________

Sub Test(ByRef Value As Long) ' ByRef можно не писать.

Value = Value * 2

End Sub
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Zenitchik » 07.09.2008 (Вс) 17:46

Объекты и массивы нельзя передавать как ByVal.
Народ, неужели трудно зайти в книжный, взять с полки книжку по VB и за пять минут прочесть все что я выше сказал?
Знание английского языка - затрудняет понимание кода

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 07.09.2008 (Вс) 18:08

Sebas писал(а):ой ёй ёй, а если переменная объект, то как быть с ByVal?

Точно также как, как если бы было Long. При ByVal передаётся указатель на объект, при ByRef — ссылка на указатель на объект.



Zenitchik писал(а):Объекты и массивы нельзя передавать как ByVal.

Речь идёт о something As Object. Оно может быть как ByRef, так и ByVal.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 07.09.2008 (Вс) 22:41

Денис
Код - лучшее объяснение!

Такой код я знаю. Хакер приводил. Я не об этом, я о
А знаешь ли ты такое, что в процедуру или функцию можно передавать аргументы, а потом работать с их изменившимися значениями (это работает при передаче аргументов по ссылке, которое прописано по умолчанию) Таким образом ты можешь организовать получение из процедуры несколько значений сразу. А из функции организовать получение нескольких значений и значение ошибки, как результат работы функции.


Хакер
А массивы? Вопрос то был
Объекты и массивы нельзя передавать как ByVal.



Далее вопрос в другом. Я упоминал в начале, но как-то забылось. Что делать если ф-я должна заполнять например поля чем-то. Точнее не так. Есть ситуация: в ComboBox-е находится 5 Item-ов. Они попадают туда например из txt файла либо из, например, базы данных (как раз у меня из БД из таблицы) во время загрузки приложения. При нажатии на кнопку, из БД например удаляется запись (из таблицы, которая была источником для ComboBox-а). В итоге в источнике четыре записи, а в ComboBox-е осталось 5. Соответственно нужно обновить ComboBox. А раз обновлять уже второй раз (выполняется тот же самый код, который был при загрузке), то необходимо подумать над процедурой. НО! обновляем данные на форме, соответственно при обновлении нужно обратиться к контролу по имени. Получается процедура не универсальна - поменяй имя контрола, и процедура не работает. А это уже плохо. Причем я саму процедуру "вшивал" в код формы. А если такую процедуру поместить в отдельный модуль, то вообще даже компиляция не пройдет.
Варианты
1. Пробовать передавать в аргументы имена нужных контролов
2. Удалять одновременно из БД и из ComboBox-а. Но этот вариант отпадает, так как я приводил пример ради примера. Т.е. это всего лишь частный случай. На самом деле у меня проблема была с заполнением ListBox.
3. Есть что-то еще, чего я не знаю. Или ситуация на самом деле глупа, и только у меня такое возникло.
4. Слышал про варианты "привязывания" источников к контролу. Т.е. когда я занимался VBA там вообще проблем с этим нет. Тут все посложнее. Я например не умею пользоваться своейством помоему DataSource (если не ошибаюсь оно занимается привязко). Но представим что такого нет. Вопрос впринципе про ф-ии...
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 08.09.2008 (Пн) 0:54

SLIM писал(а):Такой код я знаю. Хакер приводил. Я не об этом, я о

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


Код: Выделить всё
Const MYERR_NUMBER_IS_TOO_SMALL As Long = 1
Const MYERR_NUMBER_IS_TOO_BIG As Long = 2


Sub A(ByVal x As Long, ByVal y As Long)
       Dim calcResult As Long
       Dim ErrorNumber As Long
       
       B x, calcResult, ErrorNumber

       if ErrorNumber <> 0 Then
          Select Case ErrorNumber
                  Case MYERR_NUMBER_IS_TOO_SMALL
                         ' Тут обрабатываем ошибку ...

                  Case MYERR_NUMBER_IS_TOO_BIG
                         ' другую ошибку ...
          End Select
       End If

End Sub
_________________________
Sub B(ByVal SomeData As Long, ByRef Result As Long, ByRef ErrorCode As Long)
       If SomeData < 100 Then
              ErrorCode = MYERR_NUMBER_IS_TOO_SMALL
              Exit Sub
       End if

       If SomeData > 999 Then
              ErrorCode = MYERR_NUMBER_IS_TOO_BIG
              Exit Sub
       End if

       Result = SomeData - 100

End Sub


SLIM писал(а):А массивы? Вопрос то был
Объекты и массивы нельзя передавать как ByVal.


Был не вопрос, а был ответ на вопрос "А как быть с объектными ссылками насчёт ByRef/ByVal?". Ответ был дан неправильно, поэтому я поправил. Вопроса про массивы не было, поэтому и не отвечает никто.

Массивы — сложная и многогранная штука, чтобы о ней вот взять и так сказать.В общем и целом — передавать ByVal их нельзя (что по сути будет передано ByVal? ). Но их можно обернуть в Variant и его передать как ByVal. И есть ещё всякие трюки.


Последний вопрос — бредов и непонятен.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 08.09.2008 (Пн) 15:50

SLIM писал(а):Последний вопрос — бредов и непонятен.

Возможно. Перечитал - впринципе сам понял. :lol: Проблема то у меня. Я понимаю о чем там написано.
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 16.09.2008 (Вт) 22:25

Добрался до предоставленного кода. Разобрался не сразу. Но всеже получилось. Вместо процедуры A использовал события. Спасибо помогло в общем!!! Наконец увидел плюсы и минусы ByVal и ByRef.
В данный момент эксперементирую. Результат изложу позже....
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 28.09.2008 (Вс) 18:14

Немного поупрожнявшись понял, что код, приведенный Хакер-ом не то что не правиляный, просто можно с помощью ByRef обработать проще.
В процедуре возможно так

Код: Выделить всё
Private Sub Form_Load()
Dim ErrStringMSG As String
Dim ResultData As Long
ErrStringMSG = vbNullString

TestResult 15, 5, ErrStringMSG, ResultData

    If Len(ErrStringMSG) > 0 Then
        MsgBox ErrStringMSG
    Else
        MsgBox ResultData
    End If
End Sub


Sub TestResult(ByVal b As Long, ByVal c As Long, ByRef ErrorString As String, ByRef Result As Long)
   
    Result = b + c
    Select Case Result
    Case Is > 20
        ErrorString = "Ошибка. Результат больше  20"
    Case Is < 20
        ErrorString = "Ошибка. Результат меньше  20"
   End Select
   
End Sub

В данном случаем не нужно иметь какое-либо количество констант для индентификации ошибки.

Продолжение следует.......
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 28.09.2008 (Вс) 18:21

Поганый вариант.


Внешняя сторона плевать хотела на твои безвкусные текстовые сообщения об ошибках. Внешняя сторона хочет, например, чтобы когда число слишком маленькое из колонок шел звук "У-у-ууу", а когда слишком больше — звук "Э-эээ!".

Вызывающей стороне для этого тогда придётся сравнивать строки, что маразматично.

Или внешняя сторона — китайцы, и она хочет выдавать сообщения об ошибках на китайском. Что прикажешь внейшней стороне делать с твоими русскоязычными сообщениями об ошибках? Для них такой способ обратной связи (возврат строки, содержащей русскоязычное сообщение) покажется вообще издевательским.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 28.09.2008 (Вс) 19:29

Хакер ты меня видимо не понял. Вообще я то сам редко сталкивался с тем, что при ошибке будет выводиться именно диалоговое окно. Сам этого не люблю. Тут суть в самой концепции обработок ошибок. Что если вместо MsgBox будет стоять звук "ууууу"? Код перестанет быть покагым?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 28.09.2008 (Вс) 21:35

SLIM писал(а):Тут суть в самой концепции обработок ошибок.

И в чём она? В том, что вместо кода ошибки будет передоваться текстовое сообщение1 об ошибке?
Это поганая концепция.

1cообщение на натуральном языке


Что если вместо MsgBox будет стоять звук "ууууу"?

Как узнать, когда воспроизводить звук "уууу", когда "ааааа", когда "ээээ", а когда не воспроизводить?

SLIM писал(а):Код перестанет быть покагым?

Что такое "покагым"?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 28.09.2008 (Вс) 22:12

Хакер писал(а):И в чём она? В том, что вместо кода ошибки будет передоваться текстовое сообщение1 об ошибке?

а Run-time Error '....' - написано на понятном языке.
Хакер писал(а):Как узнать, когда воспроизводить звук "уууу", когда "ааааа", когда "ээээ", а когда не воспроизводить?

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 28.09.2008 (Вс) 22:28

SLIM писал(а):
Хакер писал(а):Как узнать, когда воспроизводить звук "уууу", когда "ааааа", когда "ээээ", а когда не воспроизводить?

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

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

Я отлично это понимаю. Но я уже второй раз спрашиваю и второй раз не получаю ответ: что внешней стороне делать с твоим сообщением об ошибке?
Но ты не отвечаешь. А пока это "просто один из нерабочих вариантов".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 29.09.2008 (Пн) 0:59

Хакер писал(а):Но я уже второй раз спрашиваю и второй раз не получаю ответ: что внешней стороне делать с твоим сообщением об ошибке?

А что делать когда Windows говорит о "Произошла ошибка. Выполнение приложения будет завершено...." с кнопко "ОК". Что тут пользователь будет делать.

Например если если пользователь хочет вывести в список на форме какие-то данные из БД по определенным критериям, то могут возникнуть следующие ошибки
1. Отсутствуют данные по указанным критериям
2. Отсутствие БД
3. Не введен критерий отбора
4. ....
5. .....

И т.д. Ну что тут внешняя сторона может сделать. Ну если только я смогу предложить например ввести другой критерий например. А в остальном?

Мне даже иногда кажется, что ошибки обробатывать выгоднее программисту чем пользователю - пользователь только о них извещается. А если программист не обработает ошибку - то пользователь будет в шоке от ошибки "Invalid connect", и не поймет о чем речь. А приложение завершит свою работу.
Ну это что относится к внешней стороне - пользователю. Если ты имеешь внешнюю сторону программиста - то тут уже конкретно от ситуации зависит. Он уже сам решит что делать если ошибка возникла.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 29.09.2008 (Пн) 1:03

Узость мышления страшная. БД, БД, и функции с одной глубиной вложения.

А теперь представь, что функция А вызывает функцию B, B вызывае C, а C вызывает D, а из D вызывается E, а внутри E вызывается F.

И вот внутри F происходит ошибка: F возвращает строку.
Что должна делать E с этой гадкой строкою? Как E пойдмёт из этой строки, какая из возможных шестисот ошибок произошла?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 29.09.2008 (Пн) 1:14

мы говорим о разном.
Как E поймет что за ошибка, что с ней делать и т.д. - это уже проблема программиста.
Пусть даже в "нормальном" случае "Е" поймет код ошибки, в любом случае она (функция) будет обрабаотывать ошибку либо через Select Case либо через If...Then....Else либо еще другими вариантами. Да, действительно, легче обрабатывать когда каждой ошибке соответствует константа с ее именем и значением. Это удобно для программиста. И в случае "вложения" процедуры в функцию или процедуру это действительно оптимальный вариант. Полностью согласен. Но в примитивном варианте можно поступить и предложенным мною способом.

Далее. Мне стало интересно. Я уже написал не одну функцию и процедуру с разными целями. Мне стало интересно, стоит ли на какие-то действия писать процедуру, если эти действия повторяются на протяжении всего кода 2-3 раза.
Если может не так спросил, то по другому - есть ли норма "повторения" какого-либо кода, по достижении которой оптимальнее использовать процедуру?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение Хакер » 29.09.2008 (Пн) 1:35

SLIM писал(а):Как E поймет что за ошибка, что с ней делать и т.д. - это уже проблема программиста.

Всё — проблема программиста.



Но в примитивном варианте можно поступить и предложенным мною способом.

Это не примитивный вариант, а недальновидный вариант. Это всё равно что плевать в колодец.

Если может не так спросил, то по другому - есть ли норма "повторения" какого-либо кода, по достижении которой оптимальнее использовать процедуру?

Процедура используют не только для оптимализации, но и для структуризации кода.

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


Что же касатеся кода ошибки против строчки с описанием. Используя код, мы даем программисту (себе или другому) выбор: вызывающая сторона может, получив ошибку, выдать сообщение, а может передать ошибку вышестоящей инстанции. А может не обратить внимания на ошибку. А может попытаться обработать её, и попробовать ещё раз.

Вариант с описанием же не дает программисту никакого выбора: программист ничего не может сделать с описанием, кроме как вывести его куда-то. При том, он даже не может его изменить, сделав контексто-специфичным.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Функции.....шаг первый. Вступление....непонимание

Сообщение SLIM » 29.09.2008 (Пн) 21:28

Хакер писал(а):Вариант с описанием же не дает программисту никакого выбора: программист ничего не может сделать с описанием, кроме как вывести его куда-то. При том, он даже не может его изменить, сделав контексто-специфичным.

Убедил на 100%
Пишите жизнь на чистовик.....переписать не удастся.....

След.

Вернуться в SLIM

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList