anton_reut
@anton_reut
Начинающий веб-разработчик

PHP — ООП, где взять реальные примеры кода использования ооп в веб-сервисах?

Читаю литературу и онлайн источники и ВЕЗДЕ приводятся примеры "из жизни" типа: вот есть автомобиль это абстрактный класс а есть грузовик, автобус и пр. это конкретные объекты... И всё в таком духе, но эти примеры не объясняют КАК использовать ООП подход например при написании движка Блога или Доски объявлений или еще какого то КОНКРЕТНОГО веб-проекта.
Я понимаю что такое ООП на примерах из жизни но я пока не понимаю как это использовать например при выводе доски объявлений, регистрации пользователей и прочих функций. Прошу в конкретных примерах помочь с пониманием как это использовать в реальных веб-проектах, а не на примере "кошечек и собак" или "строим самолёты".
Заранее благодарю.
  • Вопрос задан
  • 1598 просмотров
Пригласить эксперта
Ответы на вопрос 7
@netcore
Есть группа людей которые не понимают в программировании ничего, но у них есть идея, понимание как работает продукт, и деньги (но это вторично)
Назовем эту группу людей бизнес

Продукт этого бизнеса - сайт новостей. Возьмем как пример сайт новостей, потому что это по сути тот же блог.
Есть программист который понимает как автоматизировать действия этой идеи и оцифровать поведение продукта

Сначала бизнес описывает боль которую решает продукт
В чем боль? Бизнес раньше продавал газеты, а теперь хочет свою интернет газету.
1. Они не хотят тратить деньги на печать, а просто делать посты новостей и статьи.
2. Они не хотят платить деньги на транспортные расходы развозить газеты, а делать рассылки на электронную почту
3. Они хотят получать обратную связь (комментарии)
этого достаточно для примера.

В идеале бизнес заказывает дизайн. Как это должно выглядеть.
В идеале есть еще и пордакт менеджер который знает UML, но это влажные фантазии, по этому примем что есть бизнес и есть программист.

Затем описываются сущности этого продукта и действующие лица в этом продукте
Что мы можем понять из этого? Какие у нас есть сущности?
1. пост - новость или статья на сайте.
1.1. На этом этапе выясняем у бизнеса в чем отличие новости от статьи.
Бизнес говорит: у новости (например) есть только одна картинка, текст.
У статьи есть так же текст но картинок может быть несколько, так же не может быть комментариев.
Бизнес забыл про то что в дизайне есть еще и дата, тут уже додумывает сам программист взглянув на макеты.
В итоге у нас получается одна абстрактная модель Post и две ее реализующие: Article и News.

public abstract class Post
    {
        protected Post(string text, int writerId)
        {
            Text = text;
            CreationDate = DateTime.Now;
            WriterId = writerId;
        }

        public int Id { get; set; }
        public string Text { get; private set; }
        public DateTime CreationDate { get; private set; }
        //Идентификатор писателя статьи\новости
        public int WriterId { get; private set; }

        //Автоматически подтягиваемая из базы модель писателя через ORM по WriterId
        public virtual Writer Writer { get; set; }

    }

    public class Article : Post
    {
        public Picture[] Pictures { get; private set; }

        public Article(string text, int writerId, Picture[] pictures) : base(text, writerId)
        {
            Pictures = pictures;
        }
    }

    public class News : Post
    {
        public Picture Picture { get; }
        
        //Массив комментариев к посту
        // private set -- говорит о том что массив инкапсулирован
        // и управлять массивом можно только через метод AddComment
        public List<Commentary> Commentaries { get; private set; }

        public News(string text, int writerId, Picture picture) : base(text, writerId)
        {
            Picture = picture;
        }

        public void AddComment(Commentary commentary)
        {
            Commentaries.Add(commentary);
        }
    }


Далее у нас есть ролевые модели и у каждого своя бизнес логика.
2. Подписчик - получатель новостей. Бизнес хочет что бы каждый зареганый юзер автоматически стал подписчиком. Такого в реальном мире не будет, нельзя, но для примера норм.
3. Писатель - тот кто пишет статьи\новости.

Две эти модели отличаются между собой только ролью и наличием у подписчика поля email. По этому приведем вот такие ООП модели

public abstract class User
    {
        public int Id { get; set; }
        public string Username { get; private set; }
        public string Role { get; private set; }
        
        protected User(string role, string username)
        {
            Role = role;
            Username = username;
        }
    }

    public class Subscriber : User
    {
        public string Email { get; private set; }
        
        public Subscriber(string username, string email) : base(nameof(Subscriber), username)
        {
            Email = email;
        }
    }

    public class Writer : User
    {
        public Writer(string username) : base(nameof(Writer), username)
        {
        }
    }


Поле пароль опущено, тут много чего опущено для простоты восприятия.

3. Комментарий - обратная связь от юзера в посте. При чем хочу заметить от ЮЗЕРА, бизнес говорит что писать могут как и подписчик так и писатель

public class Commentary
    {
        public int Id { get; set; }
        public string CommentText { get; private set; }
        public int UserId { get; private set; }
        
        public virtual User User { get; private set; }
        
        public DateTime CommentCreationDate { get; private set; } 
        
        public Commentary(int userId, string commentText)
        {
            UserId = userId;
            CommentText = commentText;
            CommentCreationDate = DateTime.Now;
        }
    }


Вот - хоть и примитивно и немного неправильно (а то щас налетят пет программисты) но мы описали модели, абстрагировали одинаковые поля в абстрактные классы. Инкапсулировали поля и добавили методы которые описывают как работает класс. Инициализация полей происходит только в конструкторах. Работа с полями только с предоставленными для этого методами.

Прошу прощения что не PHP, но C# тоже C подобный, так что проблем с чтением на уровне моделей быть не должно.

Одна из функций ООП -- что бы программисты понимали бизнес.
Ну и человеку прозе описывать поведение реального мира объектами и как эти объекты между собой взаимодействуют.
Есть целые методологии разработки ПО такие как DDD, где вообще ядро кода пишется на копароративном языке и жестко соблюдаются правила названия моделей и описания алгоритмов бизнес процессов бизнеса. Код получается самодокументированным. Были случаи когда ядро по DDD писали даже на русском, потому что бизнес большой, а новичкам, кто приходил кодить в фирму, было быстрее и проще вкатиться в понимание прикладной практики бизнеса и понять по коду как бизнес устроен на разных слоях.
Ответ написан
php666
@php666
PHP-макака
при выводе доски объявлений
....некая сущность, назовём её Mapper, возвращает коллекцию объектов - объектов объявлений. Каждый объект == одно объявление. Объявление может иметь свойства - VIP-статус (дата конца этого статуса), типичные поля для объявления типа заголовок + текст. Далее, объявление может иметь изображения. Объект объявления имеет метод, который запрашивает у другой сущности объекты своих изображений, которые в свою очередь знают, как сформировать URl к изображению или иные характеристики изображений. Объект объявления имеет метод getPaymentSystem() - возвращается объект класса типа Kassa, он может возвратить объект Робокасса (или Frikassa), который умеет генерировать URL, который необходим для транзакции оплаты платных услуг данного объекта объявления....

--- это лишь малая описательная часть. Как пример.

я пока не понимаю как это использовать
и не поймешь без подсказок.
Твоя цель - открыть книгу "мартин фаулер архитектура корпоративных программных приложений pdf" почитать минимум 1, 2, 9 и 10 главу.
Ответ написан
search
@search
Мой дедушка индиго
Книга Приёмы объектно-ориентированного проектирования. П... предоставляет весьма популярные практики использования ООП. Написана в 1994 году. По сей день считается "маст рид" для программиста.
Ответ написан
ООП для веба - это так же, как в книжках.
Делаете класс ПостВБлоге
Описываете его свойства (они же атрибуты).
Реализуете методы для чтения и записи из/в БД.
Получается что-то вроде
class BlogPost {
    public $id;
    public $title;
    public $text;
    public $date;
    
    public function write() {
        // код записи в БД
    }
    
    public function read() {
        // код чтения из БД
    }
}

Делаете класс Комментарий
class Comment {
    public $id;
    public $text;
    public $date;
    public $blogpostId;
    
    // чёрт, здесь почти такой же код, как и в классе BlogPost
}

Придётся делать класс-предок для BlogPost и Comment
class DatabaseRecord {
    public function write() {
        // универсальный код записи в БД
    }
    
    public function read() {
        // универсальный код чтения из БД
    }
}
class Comment extends DatabaseRecord {
    // ....
}
class Comment extends DatabaseRecord {
    // ....
}


Потом идёте на https://laravel.ru/docs/v5/eloquent и с восхищением обнаруживаете, что всё уже написано за вас и для вас, и как раз с использованием ООП.
Ответ написан
1) Бери фреймворк (Ларву или симфони) и пиши на нем свой веб-сервис. В этих фреймворках (особенно в симфани) в базе используются паттерны проектирования, которые показывают тебе, как нужно использовать ООП.

2) Прочитай книгу по паттернам проектирования (Хеал фест паттерны - на обложке девочка с косичками) - это раскроет тебе глаза.

3) В реальности большая часть работы - это наследование от абстрактных классов (чаще всего, которые предоставляет тебе фреймворк), сборка классов с помощью DI (композиция) и все =)
Ответ написан
irishmann
@irishmann
Научись пользоваться дебаггером
Берите фреймворк, по их документации учитесь на нем делать
Блог или Доску объявлений
Попутно разбираетесь что к чему и как. Потом пробуете без фреймворков реализовать что-то свое.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы