Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> если нужно сделать функцию, возвращающую bool 
:(
    Опции темы
 
если нужно сделать функцию, возвращающую bool, как вы поступите?
Так и напишу bool Name(/*arguments*/). Больше и думать не о чем. Надо будет что-то изменить - поменяю прототип. [ 29 ]  [78.38%]
Не раз уже наступал на грабли изменчивости требований к функциям. Особенно к количеству возвращаемых значений. Сделаю enum и буду возвращать его. [ 3 ]  [8.11%]
Все равно bool, а все, что потом может добавиться - это ошибки - их выбрасываю исключением. [ 4 ]  [10.81%]
Все равно bool, а все, что потом может добавиться - это ошибки - их записываю в глобальную переменную, а потом, если надо, юзер использует мой GetLastError(). [ 1 ]  [2.70%]
Функция void, а возвращаемые значения выбрасываются исключением. [ 0 ]  [0.00%]
Всего проголосовавших: 37
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
Alek86
Дата 22.2.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



данный опрос возник, из-за долгого спора, как лучше поступать в данном случае.
Во всех вариантах, имхо, можно найти и плюсы и минусы.
Если что есть сказать по этому поводу (к примеру, свой вариант) - прошу


--------------------
user posted image    user posted image
PM MAIL   Вверх
Earnest
Дата 22.2.2008, 14:42 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 53
Всего: 183



Чушь это - пытаться предусмотреть заранее всевозможные изменений требований.
Если по логике вещей программа должна возвращать bool (т.е. одну из альтернатив) - возвращай bool.
Если значений вроде может быть больше, хотя сейчас только 2 - то enum.
При нормальном имени функции и хорошем дизайне - изменить определение функции и ее использование - полчаса работы + сколько нужно для перекомпиляции проекта.
И вообще, нужно решать проблемы по мере поступления, а не пытаться общую теорию всего соорудить.
Что касается 3 последних вариантов - это просто абсурд и конец ООП.


--------------------
...
PM   Вверх
Alek86
Дата 22.2.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(Earnest @  22.2.2008,  14:42 Найти цитируемый пост)
При нормальном имени функции и хорошем дизайне - изменить определение функции и ее использование - полчаса работы + сколько нужно для перекомпиляции проекта.

в случае энама это 1 минута работы + сколько нужно для перекомпиляции проекта
но енамы плодить вредно, потому и опрос создал


интересно, чем 3й вариант не понравился... зачем же еще исключения?



--------------------
user posted image    user posted image
PM MAIL   Вверх
bel_nikita
Дата 22.2.2008, 14:58 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Все уже придумано до нас smile
Код

#define TRUE 1
#define FALSE 0
typedef int BOOL;

BOOL SomeFunction()
{
  return TRUE;
}


З.Ы.: А ваще, прежде чем что-то писать, нужно хорошенько все продумать и алгоритм нарисовать на бумаге ( а лучше использовать UML ). Тогда такие споры и вопросы отпадут сами по себе


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


Эксперт
****


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

Репутация: 53
Всего: 183



Цитата(Alek86 @  22.2.2008,  15:49 Найти цитируемый пост)
интересно, чем 3й вариант не понравился... зачем же еще исключения?

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

Кстати, при расширении списка возвращаемых значений все равно нужно убедиться, что вызывающий код корректно обработает все варианты. Т.е. туда тоже сходить надо.


--------------------
...
PM   Вверх
Lazin
Дата 22.2.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



возврат bool или enum - это абсолютно разная семантика, если ф-я должна ответить на простой вопрос - да или нет, то - bool -если ответить на более сложный (например описать состояние объекта, который на данном этапе может быть в 2х состояниях, но потом их может прибавица) - тогда enum.))
PM MAIL Skype GTalk   Вверх
Alek86
Дата 22.2.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



спецально для идеалистов. Ситуация:

есть функция, которая делает импорт файла. возвращает bool - сделала или нет

и тут, оказывается, что потребовалась возможность дать юзеру прервать импорт. Ну, и иногда нужно знать. была ошибка или юзер остановил професс. Получается, что нужно менять прототип функции, перекомпиливать ВСЕ проекты (функция библиотечная, да и проекты немелкие), поскольку она вызывается не раз и не два.

Кто виноват? Ведь разработчик свою задачу сделал - написал функцию, которая возвращает даже, получилось ли импортировать файл.
Что делать? Вариант с throw не подходит, так как это не ошибка, да и заставлять дописывать везде try catch нет желания


Тут волей-неволей даже о 4м варианте задумаешься...

Это сообщение отредактировал(а) Alek86 - 22.2.2008, 15:42


--------------------
user posted image    user posted image
PM MAIL   Вверх
marcusmae
Дата 22.2.2008, 15:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

Репутация: 5
Всего: 39



Alek86, это очень специфический пример. Полагаю, что возможность прерывания составной операции будет реализована через Thread-ы c событиями. Если так, то наша BOOL Name (/* arguments */) уходит глубоко в пучину вызовов, а точкой доступа для пользователя будет какая-то новая обёрточная функция, заключающая в себе весь новоиспечённый механизм. То есть, была функция - понадобилось её расширить, не трогая её кода - сделали обёртку-фасад. И дело с концом. В более простых случаях Name может даже заинлайнится.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Lazin
Дата 22.2.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alek86 @  22.2.2008,  15:41 Найти цитируемый пост)
есть функция, которая делает импорт файла. возвращает bool - сделала или нет

нужно использовать исключение
Цитата(Alek86 @  22.2.2008,  15:41 Найти цитируемый пост)
и тут, оказывается, что потребовалась возможность дать юзеру прервать импорт.

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

bool do_part_of_whole_job();
...
while ( do_part_of_whole_job () ) {
  ..проверка - не нужно-ли прервать выполнение?
}

PM MAIL Skype GTalk   Вверх
Alek86
Дата 22.2.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(marcusmae @  22.2.2008,  15:59 Найти цитируемый пост)
понадобилось её расширить, не трогая её кода

тут наоборот: понадобилось изменить код - пожалуйста.
А трогать "интерфейс" - ох как больно...


1. получается, что в библиотечных функциях лучше bool не возвращать. Ибо потом скажется. И чем это "потом" будет позднее, тем хуже.
2. второй вариант плох только тем, что плодит лишние типы? или есть что-то, чего я не заметил?
3. еще интересно услышать, как определить, будет функция возвращать "одну из 2х альтернатив" или "одну из n альтернатив"?


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



ну и работать весь этот огород должен в соседнем потоке))
PM MAIL Skype GTalk   Вверх
Alek86
Дата 22.2.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Lazin, не совсем так.
та библиотечная функция теперь и должна реализовывать такое поведение
а вот изменение интерфейса (и очень много перекомпиляции) как раз из-за того, что разработчик посчитал:
Цитата(Earnest @  22.2.2008,  14:42 Найти цитируемый пост)
Если по логике вещей программа должна возвращать bool (т.е. одну из альтернатив) - возвращай bool.



Цитата(Lazin @  22.2.2008,  16:11 Найти цитируемый пост)
нужно использовать исключение

можно подробней? где именно?


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alek86 @  22.2.2008,  16:14 Найти цитируемый пост)
можно подробней? где именно? 

вот здесь
Цитата(Alek86 @  22.2.2008,  15:41 Найти цитируемый пост)
есть функция, которая делает импорт файла. возвращает bool - сделала или нет

если не сделала, значит исключение - ошибка импорта

Цитата(Alek86 @  22.2.2008,  16:14 Найти цитируемый пост)
та библиотечная функция теперь и должна реализовывать такое поведение
а вот изменение интерфейса (и очень много перекомпиляции) как раз из-за того, что разработчик посчитал:
Цитата(Earnest @  22.2.2008,  14:42 Найти цитируемый пост)
Если по логике вещей программа должна возвращать bool (т.е. одну из альтернатив) - возвращай bool.

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

class Importer
{
bool do_part_of_whole_job();

void do_whole_job()
 {
   while ( do_part_of_whole_job() );
 }

}; 


PM MAIL Skype GTalk   Вверх
Mayk
Дата 22.2.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Цитата(Alek86 @  22.2.2008,  20:11 Найти цитируемый пост)
А трогать "интерфейс" - ох как больно...

Мне кажется речь  о том чтобы а) сделать ф-цию myCoolLibraryFunctionEx которая возвращает enum б) реализовать ф-цию myCoolLibraryFunction примерно как
Код

/// Return true iff completed successfully.
bool myCoolLibraryFunction(int argc, char**argv){
 return myCoolLibraryFunctionEx(argc, argv) == WorkCompleted;
}

в) наслаждаться жизнью без перекомпиляции проектов.
Цитата(Alek86 @  22.2.2008,  20:11 Найти цитируемый пост)

1. получается, что в библиотечных функциях лучше bool не возвращать. Ибо потом скажется. И чем это "потом" будет позднее, тем хуже.

Ой ли?
Код

// java.lang.String
    /**
     * Tests if this string starts with the specified prefix.
     *
     * @param   prefix   the prefix.
     * @return  <code>true</code> if the character sequence represented by the
     *          argument is a prefix of the character sequence represented by
     *          this string; <code>false</code> otherwise.
     *          Note also that <code>true</code> will be returned if the
     *          argument is an empty string or is equal to this
     *          <code>String</code> object as determined by the
     *          {@link #equals(Object)} method.
     * @since   1. 0
     */
    public boolean startsWith(String prefix) {
    return startsWith(prefix, 0);
    }
 
на что тут boolean заменять? FileNotFound добавлять?



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
marcusmae
Дата 22.2.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

Репутация: 5
Всего: 39



Цитата(Alek86 @  22.2.2008,  16:11 Найти цитируемый пост)
тут наоборот: понадобилось изменить код - пожалуйста.А трогать "интерфейс" - ох как больно...


Alek86, ну а не надо трогать интерфейс! Пусть себе живёт простая и счастливая bool Name() в том виде, как она сделана - без турбо-двигателя, нитро и спойлеров. А новый фасад, может, будет реализовывать расширенный или совсем другой интерфейс на её основе. Вам же проще будет. И почему никому не пришло в голову char и wchar_t сварить некоторое квази-общее представление, так сказать РАСШИРИТЬ char до wchar_t..? smile Вместо этого многие системные вызовы существуют в двух вариантах - с постфиксами A и W.



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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