Форум программистов, компьютерный форум CyberForum.ru

Знаю ли я основы ООП? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.93
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
09.07.2012, 23:11     Знаю ли я основы ООП? #1
ООП я изучал но не применял, ну если не считать собственный класс string и примитивную обертку WinAPI. Так что прошу дайте мне задачи по ООП, чтобы понять на каком уровне находятся мои знания, и на основе этих результатов понять могу ли я читать книгу четырех или еще рано.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2012, 23:11     Знаю ли я основы ООП?
Посмотрите здесь:

С++ основы основ C++
C++ ООП Создание основы класса
C++ Основы массивов
Основы ветвления C++
Основы ООП, ввод данных C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 23:30     Знаю ли я основы ООП? #41
novi4ok, Пожалуй я бы внес исправления в свой код, в частности.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
template<typename CharT, typename TraitsT>
size_t count_words
(
   std::basic_istream<CharT, TraitsT>& stream, const std::basic_string<CharT, TraitsT>& word,
   const std::string& delims
)
{
    size_t count = 0;
    std::basic_string<CharT, TraitsT> str;
    while (std::getline(stream, str))
    {
       std::vector<std::basic_string<CharT, TraitsT>> words;
       boost::split(words, str, boost::is_any_of(delims), boost::token_compress_on);
       count += std::count(words.begin(), words.end(), word);
    }
    return count;
}
 
template<typename CharT, typename TraitsT>
size_t calc_checksum(std::basic_istream<CharT, TraitsT>& stream)
{
    size_t sum = 0;
    while (!stream.eof())
    {
        int current = 0;
        stream.read(reinterpret_cast<char*>(&current), sizeof(current));
        sum += current;
    }
    return sum;
}
Можно пойти к еще большей шаблонизации, чтобы код работал с любым типом потока ввода и любым типом строк.
Так же можно отделить парсинг от подсчета. А во втором как добиться возможности большего повторного использования так сразу на ум не приходит (только если передавать некий функтор который будет считывать нужное кол-во данных, делать какие-то опциональные действия и возвращать кол-во считанных данных). И все же хотелось бы увидеть твой вариант.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 00:49     Знаю ли я основы ООП? #42
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от novi4ok Посмотреть сообщение
главный смысл ооп не в том, чтобы классов наплодить, а чтобы повторно использовать что-нибудь было удобно.
Это неверно. БОльшая часть кода любого приложения специфична для задач им решаемым и ни как не предназначена и главное, не подготовлена для повторного использования. А если уж код действительно решает распространенную задачу, то не важно в каком стиле он написан, главное чтобы он был должным образом подготовлен. Вы изучите современные взгляды адекватных адептов ООП, поверьте, о том, что ООП решает задачу повторного использования кода как то лучше других парадигм, Вы не увидите.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 01:01     Знаю ли я основы ООП? #43
ForEveR, конечно, мы все данный пример рассматриваем как учебный, и нужно не решить, а показать, как мы могли бы решить. в реальной жизни всегда существует еще куча обстоятельств, которые нужно учитывать (что уже имеется, отпущенные время-деньги, какое предполагается развитие и пр.).
с точки зрения ооп (задача поставлена - применить ооп!) в этой задаче я бы выделил "кого-нибудь", кто умеет разбирать параметры и выдать результат (что нужно делать):

инвалидные параметры
посчитать слово "слово"
вычислить контрсумму
вывести подсказку

подсчитывать слова, вычислять сумму и выводить подсказку вроде бы не связанные между собой вещи, и создавать класс, который это все умеет - криво. но и лепить по классу для выполнения каждого из этих заданиц тоже не очень ловко.
но разбираться с ними будет проще, чем с пачкой функций.
твое, ForEveR, решение, тоже - с применением ооп (а что такое stream, vector, boost, как не классы, созданные на базе темплейтов?), но требовалось, наверное, распределить выполнение задания между созданными "самодельными" классами.
я бы такую задачу, если бы мне ее задали на собеседовании, вообще решать не стал. я бы спросил, что они хотят обо мне узнать, пусть спросят, я и так расскажу, без идиотских заморочек.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.07.2012, 01:12     Знаю ли я основы ООП? #44
novi4ok, boost это все же namespace. Я просто не стал делать новые классы для разбора и т.д., я показал как сделал бы это при возможности использовать любой готовый код.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.07.2012, 09:34     Знаю ли я основы ООП? #45
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вобщем я когда-то давно обращался сюда на форум с этой же задачей (и со своим быдлокодом), вот решение, которое предложил CyBOSSeR, на мой взгляд хорошее.
Тут только дизайн, без реализации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
class Arguments {
public:
  Arguments(char* argv, int arc);
  
  bool        has(char argumentId) const;
  std::string get(char argumentId) const;
};
 
class Command {
public:
  virtual void execute(const Arguments& arguments) const = 0;
};
 
class WordCalculator {
public:
  WordCalculator(const std::string& fileName);
 
  std::size_t calculate(const std::string& word) const;
};
 
class WordCommand : public Command {
public:
  void execute(const Arguments& arguments) {
    WordCalculator calculator(arguments.get('f'));
 
    std::cout << calculator.calculate(arguments.get('v')) << std::endl;
  }
};
 
typedef unsigned int u32;
 
class ChecksumCalculator {
public:
  ChecksumCalculator(const std::string& fileName);
 
  u32 calculate() const;
}
 
class ChecksumCommand : public Command {
public:
  void execute(const Arguments& arguments) {
    ChecksumCalculator calculator(arguments.get('f'));
 
    std::cout << calculator.calculate() << std::endl;
  }
};
 
class HelpCommand : public Command {
public:
  void execute(const Arguments&) {
    std::cout << "bla bla bla" << std::endl;
  }
};
 
class CommandRegistry {
public:
  static void registerCommand(const std::string& commandName, const std::shared_ptr<Command>& command);
  static std::shared_ptr<Command> getCommand(const std::string& commandName);
}
 
void registerCommands() {
  CommandRegistry::registerCommand("word"    , std::make_shared<WordCommand>());
  CommandRegistry::registerCommand("checksum", std::make_shared<ChecksumCommand>());
  CommandRegistry::registerCommand("help"    , std::make_shared<HelpCommand>());
}
 
int main(char* argv, int argc) {
  registerCommands();
 
  Arguments arguments(argv, argc);
 
  const std::string commandName = arguments.has('m')? arguments.get('m') : 'help';
 
  std::shared_ptr<Command> command = CommandRegistry::getCommand(commandName);
 
  command->execute(arguments);
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 10:46     Знаю ли я основы ООП? #46
Цитата Сообщение от ForEveR Посмотреть сообщение
novi4ok, boost это все же namespace.
ну да, это я с прямым углом спутал...

Добавлено через 5 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вобщем я когда-то давно обращался сюда на форум с этой же задачей (и со своим быдлокодом), вот решение, которое предложил CyBOSSeR, на мой взгляд хорошее.
Тут только дизайн, без реализации:
}[/CPP]
плохой дизайн. даже очень плохой. сделан человеком, который только-только прочитал об ооп и решил, что его теперь будет применять где только можно. как ребенок, которому подарили молоток, бегает по квартире и стучит не только по гвоздям. имею опыт сопровождения продукта, где поработал такой "дизигнер" и знаю, какой это геморрой.
чтобы не быть голословным, предлагаю кратко описать, как работает код (дезигн, если так больше нравится), созданный ForEveR, и то же самое проделать для этого "на твой взгляд хорошего" решения. просто расскажи, чтобы было понятно, как эти лебедь, щука и рак совместно трудятся. сколько слофф тебе понадобится, и будет ли после этого понятно. ооп - для упрощения, а не наоборот.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 12:20     Знаю ли я основы ООП? #47
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Kastaneda, на самом деле, сейчас я бы все таки убрал бы реестр комманд внутрь друго класса, аля CommandExecutor, чтобы main, ни про реестр, ни про команды не знала. Да и вообще бы, не стал бы выделять реестр как класс, сложил бы просто в виде std::map в CommandExecutor. И стоит подумать на тем, чтобы вообще от комманд избавится, ибо их немного совсем.
Цитата Сообщение от novi4ok Посмотреть сообщение
плохой дизайн. даже очень плохой.
По каким критериям оценивали? И какой дизайн по-вашему хорош?

Добавлено через 19 минут
Kastaneda, можно вообще избавится от интерфейса комманды, чтобы я и сделал бы, получилось бы что-то вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct CommandRegistry {
  static void CalculateWordsCount(const Arguments& args);
  static void CalculateChecksum  (const Arguments& args);
  static void PrintHelp          (const Arguments& args);
};
 
int main(char* argv[], int argc) {
  CommandExecutor cmdExecutor;
  cmdExecutor.register("word"    , std::bind(CommandRegistry::CalculateWordsCount, _1));
  cmdExecutor.register("checksum", std::bind(CommandRegistry::CalculateChecksum  , _1));
  cmdExecutor.register("help"    , std::bind(CommandRegistry::PrintHelp          , _1));
 
  Arguments args(argv, argc);
  cmdExecutor.execute(args.has('m')? args.get('m') : 'help', args);
}
Просто ICommand это скорее Java style. В boost/С+11 есть function, которыми и стоит пользоватся.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 12:34     Знаю ли я основы ООП? #48
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
По каким критериям оценивали? И какой дизайн по-вашему хорош?
критерий простой: насколько решение проще/сложнее самой задачи.
понять твое решение можно, но оно неоправданно наворочено. нужно пытаться находить простые решения для сложных задач, а твое - типичный пример того, как можно накрутить с решением примитивной задачи.
Jupiter
11.07.2012, 12:56
  #49

Не по теме:

novi4ok,

Talk is cheap. Show me the code.
это не я, это он(Торвальдс) вас матом кроет

CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 14:05     Знаю ли я основы ООП? #50
Цитата Сообщение от novi4ok Посмотреть сообщение
критерий простой: насколько решение проще/сложнее самой задачи.
Есть и другие критерии оценки дизайна, такие как степень разделения ответсвенности, связность, связанность, расширяемость и т.д. Решение этим критериям удовлетворяет.
Но все же Вы правы, решение сложновато для поставленной задачи. Все таки от команд нужно избавится в пользу обобщеных функторов и убрать реестр, получится что-то вроде примера в #47.
Kastaneda
11.07.2012, 14:26
  #51

Не по теме:

Цитата Сообщение от novi4ok Посмотреть сообщение
типичный пример того, как можно накрутить с решением примитивной задачи.
Там по условию задания было "накрутить", дабы продемонстрировать навыка владения ООП.

novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 17:35     Знаю ли я основы ООП? #52
Цитата Сообщение от Kastaneda Посмотреть сообщение

Не по теме:


Там по условию задания было "накрутить", дабы продемонстрировать навыка владения ООП.

меру знать нужно (не только в ооп)
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 18:08     Знаю ли я основы ООП? #53
novi4ok, все таки, думаю, многим хотелось бы увидеть Ваше решение. Представьте его, пожалуйста.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.07.2012, 18:56     Знаю ли я основы ООП? #54
Если кому-то интересно, это было тестовое задание в 2gis
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Представьте его, пожалуйста.
Поддерживаю!
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 21:31     Знаю ли я основы ООП? #55
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
novi4ok, все таки, думаю, многим хотелось бы увидеть Ваше решение. Представьте его, пожалуйста.
так я уже вроде высказался по этому поводу (последняя строка)?

Знаю ли я основы ООП?

так что спрашивай если что ...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 21:53     Знаю ли я основы ООП? #56
Цитата Сообщение от novi4ok Посмотреть сообщение
так что спрашивай если что ...
Это не решение, это слова. Нужен код, в достаточном количестве, чтобы оценить дизайн.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
12.07.2012, 00:47     Знаю ли я основы ООП? #57
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это не решение, это слова. Нужен код, в достаточном количестве, чтобы оценить дизайн.
0. я не собираюсь решать эту детскую задачу
1. кому нужен код?
2. мне не нужно, чтобы кто-нибудь здесь оценивал мой дизайн.

отсюда: зачем я должен тратить мое время на то, что нужно кому-то, а мне этого делать не хочется? логично? а главное - просто! это и есть ооп!
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
12.07.2012, 01:08     Знаю ли я основы ООП? #58
Программисты,кто как считает что луче использовать паблик переменный или свойства для класса?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
12.07.2012, 01:33     Знаю ли я основы ООП? #59
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от novi4ok Посмотреть сообщение
0. я не собираюсь решать эту детскую задачу
Предложите взрослую и покажите решение (но не сразу).
Цитата Сообщение от novi4ok Посмотреть сообщение
1. кому нужен код?
Как минимум три человека хотели бы увидеть Ваше решение.
Цитата Сообщение от novi4ok Посмотреть сообщение
2. мне не нужно, чтобы кто-нибудь здесь оценивал мой дизайн.
Раз уж Вы взялись критиковать чужое, представьте Ваше решение. Покажите как бы Вы решали задачу, возможно кому-то это будет полезно.
Цитата Сообщение от novi4ok Посмотреть сообщение
зачем я должен тратить мое время на то, что нужно кому-то, а мне этого делать не хочется?
Плох тот программист, который не хочет писать код. Да и на бесполезную болтовню Вы потратили больше времени.
Цитата Сообщение от novi4ok Посмотреть сообщение
а главное - просто! это и есть ооп!
Мда... Какое у Вас странноватое представление об ООП.

Добавлено через 12 минут
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Программисты,кто как считает что луче использовать паблик переменный или свойства для класса?
Класс должен представлять либо поведение и не иметь открытых полей, либо быть простым набором полей без поведения. Смешивать одно с другим не стоит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 02:10     Знаю ли я основы ООП?
Еще ссылки по теме:

C++ Основы ООП. Создание стека через класс
C++ Где могу прочитать про основы ООП?
C++ Основы ООП

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
12.07.2012, 02:10     Знаю ли я основы ООП? #60
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
...на бесполезную болтовню Вы потратили больше времени.
если для тебя это - бесполезная болтовня, то почему ты реагируешь?
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Мда... Какое у Вас странноватое представление об ООП.
у меня не "представление", у меня - опыт многолетнего успешного пркактического использования (чувствуешь разницу?)
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Класс должен представлять либо поведение и не иметь открытых полей, либо быть простым набором полей без поведения. Смешивать одно с другим не стоит.
все должно диктоваться исключительно целесообразностью конкретной задачи и ситуации, в которой приходится ее решать. все. некоторые имеют многое, но мало что умеют, некоторые - наоборот. и те и другие в какой-то ситуации оказываются полезными именно с этими свойствами. чаще - совокупность этих единиц с различными свойствами оказывается оптимальной (если удачно сконструирована и использована). (странное у тебя представление о том, "что должен представлять класс". ты еще скажи, что "класс должен иметь два метода и два три поля", или что-нибудь в этом роде).
Yandex
Объявления
12.07.2012, 02:10     Знаю ли я основы ООП?
Ответ Создать тему
Опции темы

Текущее время: 01:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru