cejare
16.07.2022 - 13:48
Всем привет.
Как известно класс это в общем смысле шаблон, а объект это в общем смысле объект реального мира.В целом это похоже на попытку описать языком программированния мир во круг, что-то вроде xml.
Если это реально так тогда получается что разделение объектов и классов, как вещи и чертежа для объекта это, просто попытка разделить некую часть логики для будующей работы, может быть в рамках такой концепции как описание мира это и имеет смысл. НО
технически можно обойтись и классами через наследование полиморфизм или просто клоннирование классов тем самым используя классы, а не объекты.
Скорее всего для описания таких сущностей как корзина или товар в большинстве случаев лучше использовать объекты.
Но при работе с логическими конструкциями управляющими системой действиетльно ли это так необходимо.
Предположим мы реализовали через комопозицию классов систему позволяющую создавать удалять и получать сессии, зачем нужно реализовывать объект для такой задачи или даже более сложной когда всю не обходимую работу я могу выполнить через стат методы классов?
Магические методы и серриализация не в счет
Попробую дополнить вопрос, может ли так оказаться что идея ООП и ее реализация в виде классов и объектов изначально задумывались для решения более простых задач, но благодаря гибкости ООп подход стал применяться для реалиацзии задач на которые не был рассчитан изначально?
Объект, это всего лишь тип данных. Он не имеет поведений. А класс наоборот, это набор поведений плюс один статический объект.
Просто нужно использовать их каждый на своем месте.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
cejare
16.07.2022 - 20:24
т.е. в теории все можно реализовать на классах, а объект использовать допустим как хранилище данных для обмена инфой между классами7
Valick
17.07.2022 - 01:55
вставлю свои пять копеек.
> зачем нужно реализовывать объект для такой задачи или даже более сложной когда всю не обходимую работу я могу выполнить через стат методы классов?
сходу: есть DI (Dependency Injection), есть тесты (моки) - это всё нереализуемо через статику. Плюс костыли в виде позднего статического связывания при наследовании - это всё непременно приведёт к каше. Стоит расценивать статический метод, как функцию в каком-то пространстве имён, не более.
Бестпрактис: хочешь статику - перехоти. Сделай хотя бы синглтон.
Цитата (cejare @ 16.07.2022 - 16:24) |
т.е. в теории все можно реализовать на классах, а объект использовать допустим как хранилище данных для обмена инфой между классами7 |
В теории, да и на практике, все и так реализуется на классах. А объект, это данные, которыми классы обмениваются. Один из частных случаев - DTO, как сказал
kirik.
Если класс работает сам по себе, как набор функций, это называется stateless. Там тоже есть объект, иначе никак не сохранить данные. Но в статике он один, и посему сложно использовать функционал повторно. Ибо у статики нет конструктора.
Раньше, если не изменяет память, до 7.2 версии php, объекты хранились как переменные, со всеми вытекающими последствиями. Это было довольно расточительно по памяти. Сейчас объекты хранятся как ресурсы, а передаются по ссылке. И теперь нет смысла писать на статике, так как от этого одни проблемы.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
cejare
17.07.2022 - 16:27
cejare, ты изобрёл DTO
ну да
Бестпрактис: хочешь статику - перехоти. Сделай хотя бы синглтон.
сингл проблем как раз нет, класс по сути и есть синглтон по своим свйствам, поэтому его и называют класс объект,м?
есть DI (Dependency Injection),
подумаю отпишусь
есть тесты (моки)
??? юнионы?
Раньше, если не изменяет память, до 7.2 версии php, объекты хранились как переменные, со всеми вытекающими последствиями. Это было довольно расточительно по памяти. Сейчас объекты хранятся как ресурсы, а передаются по ссылке. И теперь нет смысла писать на статике, так как от этого одни проблемы.
уже ближе к конкретике, но это частная реализация одного языка
и все таки в чем смысл такой организации, почему именно такими инструментами нужно было решать проблемы с ООП не понятно
cejare
17.07.2022 - 16:31
словом если бы класс можно было клонировать и назначать как значение переменной, объекты по сути были бы и не нужны
Вот смотри. Есть к примеру самолет и есть билет на рейс. В этом билете данные, кто, когда, куда летит и где именно будет сидеть. Билет, это объект. Самолет - класс. Каждый пассажир (пользователь) может воспользоваться всеми благами самолета - улететь на море отдыхать. Но все действия, от взлета до посадки, выполняет самолет и его команда, а у пассажира только данные, дающие ему право воспользоваться определенными благами.
Цитата (cejare @ 17.07.2022 - 12:31) |
словом если бы класс можно было клонировать и назначать как значение переменной, объекты по сути были бы и не нужны |
Конечно, если каждому дать по самолету, как то склонировав их, будет намного комфортнее, но сколько при этом потребуется накладных расходов и инфраструктуры?
Кстати, неортогональность императивных языков позволяет сделать всяческие нестандартные фишки. Если так нужен "склонированный" класс в переменной, пожалуйста:
$class = function($data) {
return new class($data) {
public function __construct($data)
{
echo $data;
}
public function test($data)
{
echo $data;
}
};
};
$class = $class('Hello, ');
$class->test('World!');
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
cejare
17.07.2022 - 19:04
во превых это не класс а анонимная функция в которой происходит возвращение анонимного объекта, поведение похоже на реализацию класса но все же не оно, да самолет это класс но билет может и не быть объектом, можно было бы просто наклонировать классы и в спец методе клона задать свойства билета. Но речь топика не об этом.
речь за то что по изначально классы и и объекты создавались для более конкретной задачи, но в связи с ростом возможностей и инженернопрограмной мысли уже давно переросли изначальную задумку.
возьмем к примеру абстрактную фабрику которая может создавать 3 различных объекта, ее можно же реализовать как статикой так и через объект который будет использовать методы.
Или пример с тем же самолетом, допустим мы усложнили задачу, самолетов может быть несколько, можно по идее создать самолет дочерними классами, но будет дублироваться код, значит лучше реализовать через объекты
cejare
17.07.2022 - 19:06
хотя конечно нужно признать, что имитация класса очень занимательна
Цитата (cejare @ 17.07.2022 - 15:04) |
во превых это не класс а анонимная функция в которой происходит возвращение анонимного объекта |
Ну если занудствовать, то никакая это не анонимная функция, а обыкновенный объект нативного класса Closure, синтаксический сахар. Просто суть одна - не бывает класса без объекта в оперативной памяти. Только "на бумаге". В этом и вся сермяжная правда. Статические классы про вызове тоже инстанцируют объект на нативном уровне. Ну примерно как в моем примере, тольк один единственный.
Так что какой смысл клонировать классы, забивая оперативку, когда достаточно клонировать объекты и подставлять их в один единственный класс по очереди.
А что касается этого:
Цитата (cejare @ 17.07.2022 - 15:04) |
речь за то что по изначально классы и и объекты создавались для более конкретной задачи, но в связи с ростом возможностей и инженернопрограмной мысли уже давно переросли изначальную задумку. |
это не не новость. Мало того, что переросли изначальную задумку (посмотри концепцию Smalltalk, единственного ЯП с чистым ООП), так мало и этого, давно основы ООП стали совсем другими. Многие сейчас даже и не знают, что ООП раньше зиждилось на трех китах)))
Цитата (cejare @ 17.07.2022 - 15:04) |
возьмем к примеру абстрактную фабрику которая может создавать 3 различных объекта, ее можно же реализовать как статикой так и через объект который будет использовать методы. |
это не так работает.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
cejare
18.07.2022 - 01:00
хочу знать больше
это не не новость
где просмотреть хронологию развития?
Где посмотреть данные по реализации пхп на нативном уровне?
это не так работает.
фабрика? а как?
cejare, классами ты задаёшь типы объектов и поведение для работы с этими типами. Открываешь статью "Объект" в Википедии, там:
Цитата |
Объе́кт в программировании — сущность в цифровом пространстве, обладающая состоянием и поведением, имеющая поля и методы. Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам, которые определяют поведение (являются моделью) объекта. Термины «экземпляр класса» и «объект» взаимозаменяемы[1]. Аналогия: объект - то что сделали по чертежу, класс - это чертёж. |
Классов может и не быть, зависит от реализации в языке. Это матчасть.
Цитата (cejare @ 16.07.2022 - 13:48) |
Предположим мы реализовали через комопозицию классов систему позволяющую создавать удалять и получать сессии, зачем нужно реализовывать объект для такой задачи или даже более сложной когда всю не обходимую работу я могу выполнить через стат методы классов? |
Если такую задачу нужно решать в ООП-стиле, то будет не один объект, а много. То есть будет много классов. Можно ли решить эту задачу одним статическим классом - да, будет ли это работать когда потребуется поменять механизм хранения сессий - нет.
Цитата (cejare @ 16.07.2022 - 13:48) |
Попробую дополнить вопрос, может ли так оказаться что идея ООП и ее реализация в виде классов и объектов изначально задумывались для решения более простых задач, но благодаря гибкости ООп подход стал применяться для реалиацзии задач на которые не был рассчитан изначально? |
ООП как раньше, так и сейчас решает одну единственную базовую проблему: уменьшение сложности абстракций за счёт инкапсуляции. Ничего не поменялось за эти 50-60 лет.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Цитата (cejare @ 17.07.2022 - 19:04) |
возьмем к примеру абстрактную фабрику которая может создавать 3 различных объекта, ее можно же реализовать как статикой так и через объект который будет использовать методы. |
Рассмотрим ситуацию:
Допустим есть фабрика которая печёт батоны, у этой фабрики есть метод выпечьБатон, а на вход мы можем передать строку с типом батона который нужно выпечь, метод точно вернёт батон или выбросить исключение.
На статике мы эту фабрику можем сделать статичной и в принципе пока нам нужно печь, допустим 5 типов батонов, все нормально. Но приходит бизнес и говорит, маркетинговый отдел придумал, 50 типов батонов, которые разделяются на 5 категорий, при это в категориях типы батонов пересекаются. В случае статического метода и класса фабрики, ты будешь вынужден поддерживать эти 50 типов в одном методе, в случае же если у тебя фабрика будет объектом, то ты сможешь создать еще 4 конкретных типов фабрик и над этими фабриками поставить фабрику по категории.
Было:
Цитата |
Хлебозавод->выпечьБатон(обычный); Хлебозавод->выпечьБатон(нарезной); Хлебозавод->выпечьБатон(скунжутом); Хлебозавод->выпечьБатон(скунжутом_нарезной); |
Стало:
Цитата |
АгрохолдингХлебушек->хлебозавод(обычныебатоны)->выпечьБатон(обычный); АгрохолдингХлебушек->хлебозавод(обычныебатоны)->выпечьБатон(нарезной); АгрохолдингХлебушек->хлебозавод(обычныебатоны)->выпечьБатон(скунжутом); АгрохолдингХлебушек->хлебозавод(обычныебатоны)->выпечьБатон(скунжутом_нарезной); |
Цитата |
АгрохолдингХлебушек->хлебозавод(батонысотрубями)->выпечьБатон(обычный); АгрохолдингХлебушек->хлебозавод(батонысотрубями)->выпечьБатон(нарезной); АгрохолдингХлебушек->хлебозавод(батонысотрубями)->выпечьБатон(скунжутом); АгрохолдингХлебушек->хлебозавод(батонысотрубями)->выпечьБатон(скунжутом_нарезной); |
Цитата |
АгрохолдингХлебушек->хлебозавод(батоныспряностями)->выпечьБатон(обычный); АгрохолдингХлебушек->хлебозавод(батоныспряностями)->выпечьБатон(нарезной); АгрохолдингХлебушек->хлебозавод(батоныспряностями)->выпечьБатон(скунжутом); АгрохолдингХлебушек->хлебозавод(батоныспряностями)->выпечьБатон(скунжутом_нарезной); |
Стало на статике:
Цитата |
Хлебозавод->выпечьБатон(обычный); Хлебозавод->выпечьБатон(нарезной); Хлебозавод->выпечьБатон(скунжутом); Хлебозавод->выпечьБатон(скунжутом_нарезной); Хлебозавод->выпечьБатон(батонысотрубямиобычный); Хлебозавод->выпечьБатон(батонысотрубяминарезной); Хлебозавод->выпечьБатон(батонысотрубямискунжутом); Хлебозавод->выпечьБатон(батонысотрубямискунжутом_нарезной); Хлебозавод->выпечьБатон(батоныспряностямиобычный); Хлебозавод->выпечьБатон(батоныспряностяминарезной); Хлебозавод->выпечьБатон(батоныспряностямискунжутом); Хлебозавод->выпечьБатон(батоныспряностямискунжутом_нарезной); |
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.