Другие языки программирования и технологии

Зачем нужно ООП?

Для меня ООП это просто другой способ представления программного кода. (в отличии от процедурного, функционального и императивного программирования)
.
Ну в ООП есть классы внутри которых описываются данные и функции для обработки этих данных. Ну и что с того, просто видимость данных и функций невидна всей программе и что в этом удивительного?
Sergey Kilya
Sergey Kilya
94
ООП - это всего лишь надстройка над процедурным программированием. Главная цель введения ООП - удешевление разработки. В том числе, за счёт использования менее образованных и потому более дешёвых разработчиков.

ООП позволяет тупо собирать программу из чужих готовых классов - не задумываясь о том, как внутри классов всё устроено. А сокрытие имён и пространства имён позволяют не волноваться о том, что имя функции в твоём классе может совпасть с именем функции в стороннем классе, который ты подключил к своему проекту.
Talgat T
Talgat T
80 472
Лучший ответ
Sergey Kilya >" Главная цель введения ООП - удешевление разработки. В том числе, за счёт использования менее образованных и потому более дешёвых разработчиков."
.
Интересная мысль.
Конечно удивительное искать нет смысла. ООП появилось в ответ на усложнение задач программирования. Вполне естественное решение для иерархических моделей, отражающих иерархию реальности. Среди множества методов класса, в данный конкретный момент требуется определённое подмножество. Это упрощает понимание и разработку
неужели существующей инфы для понимания оказалось недостаточно?
Некоторые задачи решаются проще при использовании ООП. Этот принцип обусловлен не только наличием классов как таковых, в нем есть еще наследование, например.
Alone Nov
Alone Nov
18 381
Единственное реальное и уместное применение ООП, которое я пока увидел - перегрузка операторов в С++.
> возьмите язвк си и делайте так, будет одно и то же:
> ...говнокод скиппед ...
На языке Си можно писать объектно-ориентированный код. Не так, конечно, как в вопросе. Первые с++ компиляторы компилировали в язык Си, который дальше уже компилировался в бинарник. С++ просто несколько облегчает его написание за счет того, что скрываются некоторые механизмы.
Основное назначение это сокращение, удобство.
Допустим у тебя есть httpclient который должен отправить на адресс 127.0.0.1 по порту 1234 сообщение протокола UDP и вернуть ответ.

В функциональном подходе ты будешь делать так:

function sendRequest(string: ip, int: port, string: protocol, string: message): string
{
// Абра кадабра которая это выполняет
return result;
}

и ты будешь делать это так:

string rs1 = sendRequest(127.0.0.1, 1234, UDP, "\x00\x01");
string rs2 = sendRequest(127.0.0.1, 1234, UDP, "\x01\x00");

повторяя ввод всех данных в параметры функции.

в случае же с ООП ты создаешь класс который хранит повторяемые элементы например

class HttpClient(string: ip, int: port, string: protocol)
{
}
method sendRequest(string message): string
{
}
и у этого класса есть уже не ФУНКЦИЯ а МЕТОД
в МЕТОД ты передаешь только 1 значение которое меняется

И код выглядит уже так:

HttpClient c = new HttpClient(127.0.0.1, 1234, UDP)

и 100500 вызовов разных методов, остальные параметры в которых берутся из обьекта класса.

string rs1 = c.sendRequest("\x00\x01");
string rs2 = c.sendRequest("\x01\x00");
Arman Nahapetyan
Arman Nahapetyan
1 372
Основные задачи ООП — повысить читабельность кода и ускорить понимание логики программы.
Sergey Kilya согласен. и в итоге этот код переводится в вид ассемблера и еще ниже на машинные коды
Sergey Kilya которые не являются ООП
Sergey Kilya возьмите язвк си и делайте так, будет одно и то же:
main()
{
}

//class dvijenie
void vpered(int next)
{
}
void nazad(int back)
{
}
// end class dvijenie
Sergey Kilya и еще вот так:
main()
{
//object from class dvijenie
void vpered(50);
void nazad(70);
void vpered(50);
void nazad(70);
void vpered(50);
void nazad(70);
//end object from class dvijenie
}

//class dvijenie
void vpered(int next)
{
}
void nazad(int back)
{
}
// end class dvijenie
Sergey Kilya вот вам и ООП
Ghenadii Lazarev ну, насчет читабельность немного спорно, вот кусок кода на функциональном языке Elixir, по моему тут даже человек, который не знает язык поймет, что происходит, а вот в ООП парадигме там иногда бывает замучаешь вверх по дереву идти, чтобы понять в каком методов и что вызывается

def changeset(user, params \\ %{}) do
user
|> cast(params, [:name, :email, :age])
|> validate_required([:name, :email])
|> validate_format(:email, ~r/@/)
|> validate_inclusion(:age, 18..100)
|> unique_constraint(:email)
end
В ООП есть полиморфизм и наследование. Ты можешь сделать что-то типа такого в СИ

void update_mega_object(mega_object* object){
switch(object->m_type)
{
case MegaObjectType::TypeA:
update_mega_object_TypeA();
break;
case MegaObjectType::TypeB:
update_mega_object_TypeB();
break;
case MegaObjectType::TypeC:
update_mega_object_TypeC();
break;
}
}
и такие сраные свитчи во всех местах, ещё надо следить на случай если добавиться новый тип или удалится старый.

очевидно что для такой программы необходим ООП.

class MegaObject{
public:
MegaObject(){}
virtual ~MegaObject(){}
virtual void Update()=0;
};

class TypeA : public MegaObject{
public:
TypeA(){}
virtual ~TypeA(){}
virtual void Update(){ printf("Update TypeA\n"); }
};

class TypeB : public MegaObject{
public:
TypeB(){}
virtual ~TypeB(){}
virtual void Update(){ printf("Update TypeB\n"); }
};

void update_mega_object(MegaObject* object)
{
object->Update();
}