За последние 24 часа нас посетили 22125 программистов и 1684 робота. Сейчас ищут 1327 программистов ...

Профессиональное использование ООП

Тема в разделе "PHP для профи", создана пользователем Dimon2x, 12 мар 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Вот я не понимаю, почему, когда делают какой-нибудь метод, то у него получается много вложений?

    Вот давайте разберём компонент league/plates, который есть на сайте packagist.
    В нём есть метод render, если кликнуть на него, то он работает, через метод make, который работает, через ещё другой метод render.

    Метод make, создаёт новый объект, в котором создаётся другой объект и там ещё много всяких вложенностей.
    Так вот я к чему, правильно ли я думаю, то, что эти вложенности (очень много небольших методов) создаются, для того, что бы использовать, для других методов, что бы не дублировать код?

    Это и есть, правильное использование ооп?
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    расскажу на своем примере про слои))

    1. Есть у меня мой велосипед..
    2. Он должен работать с БД как "взрослый" велосипед...
    3. Что я делаю, я делаю класс с статическими методами
    query
    fetchAssocc
    numRows
    freeResult
    и т.п.

    4. Я делаю интерфейс которые описывает эти же методы..
    5. Я делаю два класса DbMysqli и DbSQLite3 имплементированных от интерфейса в п4
    6. Я делаю в конфиге выбор БД и настройки..
    7. Я делаю синглтон класс Db со статическими методами, такими как в интерфейсе в статистическом свойстве которого храню объект одного из классов из пункта 5
    8. Когда я запускаю приложение то в классе Db (п7) создается нужный объект..
    9. Я делаю абстрактный класс ModelBase в котором есть свойства
    tableName - имя таблицы
    tableColumns - колонки таблицы
    в этом же классе делаю методы
    getRow
    getRows
    insertRow
    updateRow
    deleteRow

    в этом же классе делаю метод который обращается к таблице tableName и берет оттуда ее данные.. имя столбца, тип столбца, величина столбца и добавляю все это в свойство tableColumns
    метод для заполнения tableColumns у меня в каждом классе из пункта 5 свой, а обращаюсь я к этому методу через класс из пункта 7
    10. Делаю модель Users и наследую ее от ModelBase
    в этой модели сразу заполняю свойство $this->tableName = 'users'
    и грубо говоря все)) у меня готова модель в которой есть базовые методы для работы с таблицей))
    остается только делать методы которые подготавливают специфические данные..
    вот так я в своем велосипеде в его ядре использовал принципы ООП))
    --- Добавлено ---
    сейчас делаю проект который должен работать без базы.. нужно упростить процесс переноса)) начал я его делать на mysqli, а потом оказалось что надо что бы база была на файлах))
    я просто в настройке переключился на sqlite3 (правда через PDO) и учитывая то что я стараюсь использовать простые запросы, а в этом проекте сложных и не должно быть.. мне ничего не пришлось переделывать)) вообще ничего)) все продолжило работать на sqlite3 так же само как 15 минут назад работало на mysqli
     
    Dimon2x нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    в PDO (mysqli)
    при бидинге не учитываются типы.
    Все приходит в типе string
     
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    в sqlite3 тоже не учитывается?) а то я и для него сделал))
    --- Добавлено ---
    я в sqlite столкнулся с тем что там не работает num_rows)) пришлось костыль делать что бы мое наследование работало)
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    не проверялось
    --- Добавлено ---
    интересно.
    --- Добавлено ---
    SQLite3 doesn't implement buffered results so the total number of
    results isn't available. This is down to the fact that libsqlite really
    doesn't implement it either and its emulated by the old SQLite
    extension.
    --- Добавлено ---
    http://grokbase.com/t/php/php-bugs/098m0ypzck/49303-new-sqlite3-numrows-not-implemented
     
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    да)) я читал)) пришлось костыль делать)) лишний запрос))
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    в моем кармане всегда найдется пару вариантов завелосипедить ! Ыть
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    Мелкие классы и методы это следствие принципа единственной ответственности (обязанности) в ООП. Благодаря этому облегчается тестирование и модификация в будущем.

    ИМХО, меру надо знать в любом правиле :)
    --- Добавлено ---
    https://ru.wikipedia.org/wiki/Принцип_единственной_ответственности
    --- Добавлено ---
    https://ru.wikipedia.org/wiki/Разделение_ответственности
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Ну ты же не разобрался, зачем это сделано. Чтоб можно было редерелку подменять через DI-контейнеры