Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
 Аватар для dr.curse
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907

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

09.07.2012, 23:11. Показов 6961. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ООП я изучал но не применял, ну если не считать собственный класс string и примитивную обертку WinAPI. Так что прошу дайте мне задачи по ООП, чтобы понять на каком уровне находятся мои знания, и на основе этих результатов понять могу ли я читать книгу четырех или еще рано.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2012, 23:11
Ответы с готовыми решениями:

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

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

ООП Создание основы класса
Здравствуйте, получил задание, но немного недопонимаю как это сделать, с чего начать. Помогите пожалст или объясните образно как сделать, а...

62
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.07.2012, 23:30
Студворк — интернет-сервис помощи студентам
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;
}
Можно пойти к еще большей шаблонизации, чтобы код работал с любым типом потока ввода и любым типом строк.
Так же можно отделить парсинг от подсчета. А во втором как добиться возможности большего повторного использования так сразу на ум не приходит (только если передавать некий функтор который будет считывать нужное кол-во данных, делать какие-то опциональные действия и возвращать кол-во считанных данных). И все же хотелось бы увидеть твой вариант.
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 00:49
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от novi4ok Посмотреть сообщение
главный смысл ооп не в том, чтобы классов наплодить, а чтобы повторно использовать что-нибудь было удобно.
Это неверно. БОльшая часть кода любого приложения специфична для задач им решаемым и ни как не предназначена и главное, не подготовлена для повторного использования. А если уж код действительно решает распространенную задачу, то не важно в каком стиле он написан, главное чтобы он был должным образом подготовлен. Вы изучите современные взгляды адекватных адептов ООП, поверьте, о том, что ООП решает задачу повторного использования кода как то лучше других парадигм, Вы не увидите.
4
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 01:01
ForEveR, конечно, мы все данный пример рассматриваем как учебный, и нужно не решить, а показать, как мы могли бы решить. в реальной жизни всегда существует еще куча обстоятельств, которые нужно учитывать (что уже имеется, отпущенные время-деньги, какое предполагается развитие и пр.).
с точки зрения ооп (задача поставлена - применить ооп!) в этой задаче я бы выделил "кого-нибудь", кто умеет разбирать параметры и выдать результат (что нужно делать):

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

подсчитывать слова, вычислять сумму и выводить подсказку вроде бы не связанные между собой вещи, и создавать класс, который это все умеет - криво. но и лепить по классу для выполнения каждого из этих заданиц тоже не очень ловко.
но разбираться с ними будет проще, чем с пачкой функций.
твое, ForEveR, решение, тоже - с применением ооп (а что такое stream, vector, boost, как не классы, созданные на базе темплейтов?), но требовалось, наверное, распределить выполнение задания между созданными "самодельными" классами.
я бы такую задачу, если бы мне ее задали на собеседовании, вообще решать не стал. я бы спросил, что они хотят обо мне узнать, пусть спросят, я и так расскажу, без идиотских заморочек.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2012, 01:12
novi4ok, boost это все же namespace. Я просто не стал делать новые классы для разбора и т.д., я показал как сделал бы это при возможности использовать любой готовый код.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.07.2012, 09:34
Лучший ответ Сообщение было отмечено как решение

Решение

Вобщем я когда-то давно обращался сюда на форум с этой же задачей (и со своим быдлокодом), вот решение, которое предложил 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);
}
3
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 10:46
Цитата Сообщение от ForEveR Посмотреть сообщение
novi4ok, boost это все же namespace.
ну да, это я с прямым углом спутал...

Добавлено через 5 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вобщем я когда-то давно обращался сюда на форум с этой же задачей (и со своим быдлокодом), вот решение, которое предложил CyBOSSeR, на мой взгляд хорошее.
Тут только дизайн, без реализации:
}[/CPP]
плохой дизайн. даже очень плохой. сделан человеком, который только-только прочитал об ооп и решил, что его теперь будет применять где только можно. как ребенок, которому подарили молоток, бегает по квартире и стучит не только по гвоздям. имею опыт сопровождения продукта, где поработал такой "дизигнер" и знаю, какой это геморрой.
чтобы не быть голословным, предлагаю кратко описать, как работает код (дезигн, если так больше нравится), созданный ForEveR, и то же самое проделать для этого "на твой взгляд хорошего" решения. просто расскажи, чтобы было понятно, как эти лебедь, щука и рак совместно трудятся. сколько слофф тебе понадобится, и будет ли после этого понятно. ооп - для упрощения, а не наоборот.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 12:20
Лучший ответ Сообщение было отмечено как решение

Решение

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, которыми и стоит пользоватся.
3
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 12:34
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
По каким критериям оценивали? И какой дизайн по-вашему хорош?
критерий простой: насколько решение проще/сложнее самой задачи.
понять твое решение можно, но оно неоправданно наворочено. нужно пытаться находить простые решения для сложных задач, а твое - типичный пример того, как можно накрутить с решением примитивной задачи.
0
11.07.2012, 12:56
Лучший ответ Сообщение было отмечено как решение

Решение

Не по теме:

novi4ok,

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

4
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 14:05
Цитата Сообщение от novi4ok Посмотреть сообщение
критерий простой: насколько решение проще/сложнее самой задачи.
Есть и другие критерии оценки дизайна, такие как степень разделения ответсвенности, связность, связанность, расширяемость и т.д. Решение этим критериям удовлетворяет.
Но все же Вы правы, решение сложновато для поставленной задачи. Все таки от команд нужно избавится в пользу обобщеных функторов и убрать реестр, получится что-то вроде примера в #47.
0
11.07.2012, 14:26

Не по теме:

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

0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 17:35
Цитата Сообщение от Kastaneda Посмотреть сообщение

Не по теме:


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

меру знать нужно (не только в ооп)
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 18:08
novi4ok, все таки, думаю, многим хотелось бы увидеть Ваше решение. Представьте его, пожалуйста.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.07.2012, 18:56
Если кому-то интересно, это было тестовое задание в 2gis
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Представьте его, пожалуйста.
Поддерживаю!
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 21:31
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
novi4ok, все таки, думаю, многим хотелось бы увидеть Ваше решение. Представьте его, пожалуйста.
так я уже вроде высказался по этому поводу (последняя строка)?

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

так что спрашивай если что ...
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 21:53
Цитата Сообщение от novi4ok Посмотреть сообщение
так что спрашивай если что ...
Это не решение, это слова. Нужен код, в достаточном количестве, чтобы оценить дизайн.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
12.07.2012, 00:47
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это не решение, это слова. Нужен код, в достаточном количестве, чтобы оценить дизайн.
0. я не собираюсь решать эту детскую задачу
1. кому нужен код?
2. мне не нужно, чтобы кто-нибудь здесь оценивал мой дизайн.

отсюда: зачем я должен тратить мое время на то, что нужно кому-то, а мне этого делать не хочется? логично? а главное - просто! это и есть ооп!
0
 Аватар для xADMIRALx
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
12.07.2012, 01:08
Программисты,кто как считает что луче использовать паблик переменный или свойства для класса?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
12.07.2012, 01:33
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от novi4ok Посмотреть сообщение
0. я не собираюсь решать эту детскую задачу
Предложите взрослую и покажите решение (но не сразу).
Цитата Сообщение от novi4ok Посмотреть сообщение
1. кому нужен код?
Как минимум три человека хотели бы увидеть Ваше решение.
Цитата Сообщение от novi4ok Посмотреть сообщение
2. мне не нужно, чтобы кто-нибудь здесь оценивал мой дизайн.
Раз уж Вы взялись критиковать чужое, представьте Ваше решение. Покажите как бы Вы решали задачу, возможно кому-то это будет полезно.
Цитата Сообщение от novi4ok Посмотреть сообщение
зачем я должен тратить мое время на то, что нужно кому-то, а мне этого делать не хочется?
Плох тот программист, который не хочет писать код. Да и на бесполезную болтовню Вы потратили больше времени.
Цитата Сообщение от novi4ok Посмотреть сообщение
а главное - просто! это и есть ооп!
Мда... Какое у Вас странноватое представление об ООП.

Добавлено через 12 минут
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Программисты,кто как считает что луче использовать паблик переменный или свойства для класса?
Класс должен представлять либо поведение и не иметь открытых полей, либо быть простым набором полей без поведения. Смешивать одно с другим не стоит.
7
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
12.07.2012, 02:10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
...на бесполезную болтовню Вы потратили больше времени.
если для тебя это - бесполезная болтовня, то почему ты реагируешь?
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Мда... Какое у Вас странноватое представление об ООП.
у меня не "представление", у меня - опыт многолетнего успешного пркактического использования (чувствуешь разницу?)
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Класс должен представлять либо поведение и не иметь открытых полей, либо быть простым набором полей без поведения. Смешивать одно с другим не стоит.
все должно диктоваться исключительно целесообразностью конкретной задачи и ситуации, в которой приходится ее решать. все. некоторые имеют многое, но мало что умеют, некоторые - наоборот. и те и другие в какой-то ситуации оказываются полезными именно с этими свойствами. чаще - совокупность этих единиц с различными свойствами оказывается оптимальной (если удачно сконструирована и использована). (странное у тебя представление о том, "что должен представлять класс". ты еще скажи, что "класс должен иметь два метода и два три поля", или что-нибудь в этом роде).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2012, 02:10
Помогаю со студенческими работами здесь

Основы ООП, ввод данных
Собственно, осваивая основы ООП и выполняя заодно частичное задание с универа(1 курс :scratch:) Наткнулся на проблему ввода данных в...

Ооп. Изучаю основы, обьясните на примере
Класс: форум - сайт для общения. Объект форум - собственно любой форум. Тут все понятно. Форумный движок тоже класс, соответственно...

Где могу прочитать про основы ООП?
Где могу прочитать про основы ООП?

Основы ООП. Создание стека через класс
Приветствую всех пользователей форума. Относительно недавно начал осваивать ООП. Было необходимо выполнить следующее задание : нужно...

Основы ООП [С++]
Немного знаю Java, написал программу которая по заданным 2-м сторонам и углом между нимию Попробовал перевести на С++ #include...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru