Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
814 views
in Technique[技术] by (71.8m points)

php - Dual Load/Save Objects in OOPHP - unnecessary duplication?

I have a (conceptually) fairly simple application spec that I'm implementing in PHP - the large part of it consists of loading project data, displaying it, allowing a user to edit it (potentially adding sections) and then sending said data back to the database.

I'm planning on approaching it thusly:

  • Have a set of basic 'Load' objects (E.g. ProjectLoad, FormLoad) that take an ID upon creation, query the database and fill themselves with the fetched data. These objects can then be used to fill the page elements.

  • Have another set of 'Save' objects (E.g. ProjectSave, FormSave) that take arrays (returned when the page is submitted), fill themselves with that data and then perform INSERTUPDATE operations on the database.

Is this unnecessary duplication? I'm just getting a handle on OOPHP, and all of the advice I've seen so far seems to indicate that it is best to try and keep everything (objects, methods, etc) as focussed and single-purpose as possible. This seems to meet that criteria, but is there a better way?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

It looks like what you managed to brainstorm your way to two concepts:

  • the core idea behind Data Mappers

  • separation the logic for creating new entries and the logic for retrieving data (this idea is really important in CQRS, especially in context of Event Sourcing)

But I suspect that, while data mappers should be quite easy for you to grasp, the second, CQRS-related, part might be at least a year too soon for you to explore.

As for your questions..
Unless you do something stupid, there wouldn't be much duplication in your "load object" and "save objects" .. though, you probably will extract either one or two superclasses there.

The "advice you have seen" is actually called Single Responsibility Principle and is, TBH, is one is more nebulous concepts in OOP. It's like defining, what "porn" is - know it, when you see it.

And, if you want a recommendation for better approach, I would suggest to combine the read and write part in a singe data mapper. Kinda like this:

$project = new EntityProject;
$mapper = new MapperProject($pdo);

$project->setId(43);
$mapper->load($project); //pulls data about project 43 from DB

if ($project->getDeadline() > time()) {
    $project->setStatus(EntityProject::STATUS_OVERDUE);
    $mapper->save($project);  //pushes changed state to DB
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...