Примеры классов в программировании?

Собственно можете привести яркие примеры, зачем нужны классы? Чем не угодила многим обычная, модульная или процедурная конструкция? Я имею ввиду, чем переменная в классе "лучше" глобальной переменной? И как связан enum в C++ с классами?
Ведь можно обойтись без классов..
  • Вопрос задан
  • 3731 просмотр
Решения вопроса 2
aush
@aush
The venerable master Qc Na was walking with his student, Anton. Hoping to prompt the master into a discussion, Anton said "Master, I have heard that objects are a very good thing - is this true?" Qc Na looked pityingly at his student and replied, "Foolish pupil - objects are merely a poor man's closures."

Chastised, Anton took his leave from his master and returned to his cell, intent on studying closures. He carefully read the entire "Lambda: The Ultimate..." series of papers and its cousins, and implemented a small Scheme interpreter with a closure-based object system. He learned much, and looked forward to informing his master of his progress.

On his next walk with Qc Na, Anton attempted to impress his master by saying "Master, I have diligently studied the matter, and now understand that objects are truly a poor man's closures." Qc Na responded by hitting Anton with his stick, saying "When will you learn? Closures are a poor man's object." At that moment, Anton became enlightened.

Anton van Straaten

Без классов прекрасно можно обойтись. Более того, на примере разработки на объектно-ориентированном C# можно заметить, что если четко следовать принципам Single responsibility и Open/closed из SOLID, то код начинает сильно напоминать функциональный.

Тут нет такого, как лучше/хуже. Есть разные задачи, разные подходы и разные инструменты.

Можно сказать, что главная задача, которую решают классы - инкапсуляция. Допустим, два человека работают с одним проектом и оба создают для своей задачи какую-то глобальную переменную и работают с ней в своих функциях. В итоге, ни один из них не может быть уверен в том, какое значение имеет эта переменная в заданный момент времени. Если же каждый из них следует принципу инкапсуляции, то такой проблемы обычно не возникает.
Ответ написан
tsarevfs
@tsarevfs
C++ developer
Когда программы становятся большими, очень хочется, чтобы при изменении одного куска не ломалось все остальное. Для этого программы разбиваются на части, взаимодействующие через некоторые интерфейсы. Чем этих связей меньше, тем проще поддерживать такой код.
Переменная(private) в классе лучше глобальной тем, что доступ к ней имеет только сам класс. В таком случае я могу при написании класса рассчитывать, что свои данные меняю только я, поэтому в каждый момент времени они непротиворечивы. Например класс Square описывает квадрат, у которого мы хотим задавать длину стороны и спрашивать его площадь.
class Square
{
  void setSide(double side)
  {
    side_ = side;
    area_ = side * side;
  }
  double getSide()
  {
    return side_;
  }
  double getArea()
  {
    return area_;
  }
private:
  double side_;
  double area_;
}


В процедурном варианте кто-то может изменить длину стороны и забыть (сам дурак, но если параметров не два а несколько десятков, помнить о всех закономерностях затруднительно) изменить площадь, в таком случае, он начнет получать неправильные результаты.
Еще прочитайте про наследование, оно используется очень часто.
Про enum можно не забивать голову пока.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
viktorvsk
@viktorvsk
Ассемблер - классная штука. Но жизнь коротка.
Ответ написан
Комментировать
cjey
@cjey
Классы нужны для реализации объектно ориентированного подхода в программировании.
Поэтому правильнее сравнивать ООП и Процедурное или модульное программирование.
У всех подходов есть свои плюсы и минусы, где-то удобнее один подход, где-то другой.

В вкратце плюсы ООП:
* Инкапсуляция. Проверка прав доступа данных на уровне языка. Нельзя случайно испортить чужую переменную. Объединение данных и методов работы с данными в одну сущность.
* Абстракция. Можно работать с объектами как с черным ящиком, не задумываясь как оно устроено внутри.
* Наследование. Можно породить сущность на основе уже существующей, немного ее изменив. Нет необходимости полного описания новой сущности, достаточно описать только различия.
* Полиморфизм. Можно работать с группой разных сущностный через общий интерфейс.
Ответ написан
@bromzh
Drugs-driven development
Да, можно реализовать все паттерны ООП без использования классов, объектов и других вещей. Но по-сути, ООП позволяет это делать наглядее и удобнее в некоторых случаях. Т.е. тебе не нужно реализовывать в своей программе всякие паттерны, это всё сделано в самом языке за тебя. ООП - это некая абстракция для работы с данными, как с объектами реального мира.

Просто есть области, где ООП наиболее лучше подходит для решения задачи. Есть области, где оно не будет оптимальным. Главное - это знать и понимать, где оно нужно, а где нет. Это уже с опытом приходит.
Ответ написан
Комментировать
Rinz
@Rinz
Программист на С++,PHP,C#,Java,Lisp,Smaltak,Python
Сторонники "процедурного подхода" странные, да не отрицаю что все можно и без ООП сделать, но про "читаемость кода" все забыли походу, в "процедурном подходе" очень часто возникает дикий говнокод с которым без вискаря не разобраться что и откуда берется(если проект большой), ООП не нужен для малых проектов, там он явно будет не зачем(если не нужно будет развивать этот проект).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы