Посмотрев на ваш вопрос, ответы и ваши ответы;Я мог бы помочь немного больше здесь (хотя трудно охватить все в одном ответе).
Я вижу, что вы хотите здесь сделать, и, честно говоря, именно так начинается большинство фреймворков.из;делая набор классов для обработки всего, затем, когда они становятся более многократно используемыми, они часто используют проверенные и протестированные шаблоны, пока, наконец, не получат то, что я бы сказал, «просто еще один фреймворк», все они делают почти одно и то же,во многом таким же образом, и стремятся быть максимально пригодными для повторного использования - как правило, единственное различие между ними заключается в стилях кодирования и качестве - то, что они делают, в значительной степени одинаково для всех.
Я верю вамЗдесь мы расскажем вам о небольшом количестве анти-паттернов в вашем дизайне. Вы сосредоточены на том, чтобы сделать большой кусок кода для повторного использования, проверки, презентации и т. д. - но то, что вы на самом деле делаете (иконечно, без обид) делает рабочий код приложения очень специфичным для домена, и не только это, но и дизайн, который вы иллюстрируете, сделает практически невозможным расширение, изменение слоев (например, создание мобильной версии), обмен технологиями (например, swap dbпоставщики) и еще дальше, потому что у вас есть презентация и приложение (d) данные, смешанные воедино, любой дизайнер, работающий с этим приложением, должен будет работать над ним и изменять код приложения - ударить в то время, когда у вас есть две версии приложения и вы столкнулись с большой беспорядочной проблемой.
Как и в большинстве задач программирования, вы можете решить эту проблему, выполнив три вещи:
- проектирование модели предметной области.
- указание и проектирование интерфейсов, а не беспокойство ореализация.
- разделение сквозных задач
Разработка модели предметной области - очень важная часть OO-программирования на основе классов, если вы никогда не делали этого раньше, то сейчас идеальное время, не имеет значения, делаете ли вы это на языке моделирования, таком как UML, или просто в простом тексте, идея состоит в том, чтобы определить все сущности в вашем домене, при обсуждении этого легко перейти к написанию книги, но давайте продолжимэто просто.Ваша доменная модель включает в себя все сущности в домене вашего приложения, каждая сущность - это вещь, например, пользователь, адрес, статья, продукт и т. Д., Каждая сущность обычно определяется как класс (который является образцом этой сущности) и каждый классимеет свойства (например, username, register_date и т. д.).
Class User {
public $username;
public $register_date;
}
Часто мы можем хранить их как POPO, однако их часто лучше рассматривать как объекты переноса (часто называемые объектами передачи данных, объектами значений) - простойКлассовая схема объекта в вашем домене - обычно мы стараемся сохранять их переносимыми, чтобы они могли быть реализованы на любом языке, передаваться между приложениями, сериализироваться и отправляться в другие приложения и т. П. - это на самом деле не обязательноничто не является обязательным - но оно затрагивает разделение интересов в том смысле, что оно обычно было бы голым, не подразумевало бы никакой функциональности, просто план хранения значений.Резкий контраст с бизнес-объектами и служебными классами, которые на самом деле «делают» вещи, являются реализациями функциональности, а не просто держателями значений.
Не обманывайте себя, и наследование, и композиция также играют свою роль в модели предметной областиПользователь может иметь несколько адресов, каждый адрес может быть адресом нескольких разных пользователей.BillingAddress может расширять обычный адрес и добавлять дополнительные свойства и так далее.(в сторону: что такое пользователь? у вас есть пользователь? у вас есть человек с 1- * учетными записями пользователей?).
После того, как вы получили модель вашего домена, следующим шагом, как правило, является сопоставление того или иного уровня персистентности (обычно с базой данных) двумя распространенными способами сделать это (четко определенным образом) с помощью ORM (например,как доктрина, которая в симфонии, если я правильно помню), и другой способ - использовать шаблон DAO - я оставлю эту часть там, но обычно это отдельная часть системы, слои DAO у вас есть преимущество в том, что вы указываете все методы, доступные для работы со слоем постоянства для каждой сущности, при этом сохраняя реализацию абстрагированной, таким образом вы можете менять поставщиков базы данных без изменения кода приложения (или, как говорят многие бизнес-правила).
Я собираюсь перейти к серой области со следующим примером, как уже упоминалось ранее. Передающие объекты (наши сущности) обычно являются голыми объектами, но они также часто являются хорошим местом для привязки к другим функциям.посмотрите, что я имею в виду.
Чтобы проиллюстрировать интерфейсы, вы можете просто определитьИнтерфейс для всех ваших сущностей, который выглядит примерно так:
Interface Validatable {
function isValid();
}
, тогда каждая из ваших сущностей может реализовать это с помощью своей собственной процедуры проверки:
Class User implements Validatable {
public function isValid()
{
// custom validation here
return $boolean;
}
}
Теперь вы этого не делаетевам нужно беспокоиться о создании какого-то сложного способа проверки объектов, вы можете просто вызвать isValid () для любой сущности и выяснить, действителен ли он или нет.
Самое важное, на что нужно обратить внимание, - это определить интерфейс,мы разделили некоторые проблемы, поскольку никакой другой части приложения не нужно ничего делать для проверки объекта, все, что им нужно знать, это то, что это Validatable и вызывать метод isValid ().
Тем не менее, мы столкнулись с некоторыми проблемами в том, что каждый объект (экземпляр класса) теперь имеет свои собственные правила проверки и модель.Возможно, имеет смысл абстрагироваться от этого, один простой способ сделать это состоит в том, чтобы сделать метод проверки статическим, чтобы вы могли определить:
Class User {
public static function validate(User $user)
{
// custom validation here
return $boolean;
}
}
Или вы можете перейти к использованию геттеров и сеттеров, это другойочень распространенный шаблон, в котором вы можете скрыть проверку внутри установщика, таким образом гарантируя, что каждое свойство всегда содержит действительные данные (или нулевое значение, или значение по умолчанию).
Или, возможно, вы перемещаете проверку в свою собственную библиотеку?Класс Validate с его собственными методами, или, может быть, вы просто добавляете его в слой DAO, потому что вам нужно только проверять что-то, когда вы сохраняете его, или, возможно, вам нужно проверять, когда вы получаете данные и когда вы сохраняете их - как вы в конечном итоге делаетеэто ваш призыв, и нет «лучшего пути».
Третье соображение, которое я уже затронул, - это разделение интересов - должен ли слой постоянства заботиться о том, как представлены вещи, которые он сохраняет?должна ли бизнес-логика заботиться о том, как вещи представлены?должна ли организация заботиться о том, где и как она отображается?или уровень представления должен заботиться, как вещи представлены?Точно так же мы можем спросить, будет ли когда-либо только один уровень представления?на одном языке?Как насчет того, как метка появляется в предложении, конечно, отдельные пользователи и адреса имеют смысл, но вы не можете просто + s, чтобы показать списки, потому что пользователи правы, а адреса неправильны;) - также у нас есть рабочие соображения, как я хочуновый дизайнер должен изменить код приложения, просто чтобы изменить представление «учетной записи пользователя» на «учетную запись пользователя», даже если я хочу изменить код приложения в классах, когда запрашивается это изменение?
Наконец, и просто для того, чтобы бросить все, что я сказал - вы должны спросить себя, какую работу я пытаюсь сделать здесь?я создаю большое многократно используемое приложение с потенциально большим количеством разработчиков и длинным жизненным циклом здесь - или достаточно простого php-скрипта для каждого представления и действия (тот, который читает $ _GET / $ _ POST, проверяет, сохраняет в db, затем отображает то, что долженили перенаправляет туда, куда следует) - во многих, если не во всех случаях, это все, что нужно.
Помните, что PHP вызывается, когда на веб-сервер делается запрос, а затем отправляет ответ [конец], вот и все, что происходит между тем, когда ваш домен, ваша работа, клиент и пользователь обычно не ' Это не важно, и вы можете подытожить, что вы пытаетесь сделать, просто: создайте сценарий, чтобы ответить на этот запрос как можно быстрее, с ожидаемыми результатами. Вот и все не должно быть сложнее.
Быть тупым, делать все, что я упомянул и многое другое - это отличная вещь, вы будете учиться много, лучше понимать свою работу и т. Д., Но если вы просто хотите получить работу за дверью и ее легко поддерживать простым код в конце, просто создайте один сценарий для каждого просмотра и один для каждого действия с нечетным повторно используемым битом (например, обработчик http, класс db, класс электронной почты и т. д.).