Для меня ООП это просто другой способ представления программного кода. (в отличии от процедурного, функционального и императивного программирования)
.
Ну в ООП есть классы внутри которых описываются данные и функции для обработки этих данных. Ну и что с того, просто видимость данных и функций невидна всей программе и что в этом удивительного?
Другие языки программирования и технологии
Зачем нужно ООП?
ООП - это всего лишь надстройка над процедурным программированием. Главная цель введения ООП - удешевление разработки. В том числе, за счёт использования менее образованных и потому более дешёвых разработчиков.
ООП позволяет тупо собирать программу из чужих готовых классов - не задумываясь о том, как внутри классов всё устроено. А сокрытие имён и пространства имён позволяют не волноваться о том, что имя функции в твоём классе может совпасть с именем функции в стороннем классе, который ты подключил к своему проекту.
ООП позволяет тупо собирать программу из чужих готовых классов - не задумываясь о том, как внутри классов всё устроено. А сокрытие имён и пространства имён позволяют не волноваться о том, что имя функции в твоём классе может совпасть с именем функции в стороннем классе, который ты подключил к своему проекту.
Конечно удивительное искать нет смысла. ООП появилось в ответ на усложнение задач программирования. Вполне естественное решение для иерархических моделей, отражающих иерархию реальности. Среди множества методов класса, в данный конкретный момент требуется определённое подмножество. Это упрощает понимание и разработку
неужели существующей инфы для понимания оказалось недостаточно?
неужели существующей инфы для понимания оказалось недостаточно?
Некоторые задачи решаются проще при использовании ООП. Этот принцип обусловлен не только наличием классов как таковых, в нем есть еще наследование, например.
Единственное реальное и уместное применение ООП, которое я пока увидел - перегрузка операторов в С++.
> возьмите язвк си и делайте так, будет одно и то же:
> ...говнокод скиппед ...
На языке Си можно писать объектно-ориентированный код. Не так, конечно, как в вопросе. Первые с++ компиляторы компилировали в язык Си, который дальше уже компилировался в бинарник. С++ просто несколько облегчает его написание за счет того, что скрываются некоторые механизмы.
> ...говнокод скиппед ...
На языке Си можно писать объектно-ориентированный код. Не так, конечно, как в вопросе. Первые с++ компиляторы компилировали в язык Си, который дальше уже компилировался в бинарник. С++ просто несколько облегчает его написание за счет того, что скрываются некоторые механизмы.
Основное назначение это сокращение, удобство.
Допустим у тебя есть 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");
Допустим у тебя есть 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");
Основные задачи ООП — повысить читабельность кода и ускорить понимание логики программы.
Sergey Kilya
согласен. и в итоге этот код переводится в вид ассемблера и еще ниже на машинные коды
Sergey Kilya
которые не являются ООП
Sergey Kilya
возьмите язвк си и делайте так, будет одно и то же:
main()
{
}
//class dvijenie
void vpered(int next)
{
}
void nazad(int back)
{
}
// end class dvijenie
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
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
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();
}
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();
}
Похожие вопросы
- Зачем нужно ООП? Зачем нужно объектно-ориентированное программирование?
- Зачем нужно ООП? Оно упрощает жизнь??
- Зачем нужно ООП ?
- Изучнние ООП - стоит ли сейчас?
- ООП. Стоит ли браться за ООП новичку в программировании?:
- Зачем нужно в с++ ООП? Ну классы, объекты? Если в си их не было, но язык исаользуется по сей день.
- ООП - зло. Ваше мнение.
- Объектно ориентированное программирование. (ООП)
- Что такое ООП для человека который не знает других парадигм
- ООП, интересно узнать ...
.
Интересная мысль.