Ed Lazor wrote:
On Oct 12, 2006, at 12:15 PM, Stut wrote:
As such you cannot start designing a solution unless you know how the data/entities are going to be used.

Doesn't this mean that your design breaks when the behavior or use of the data/entities changes?

You may end up refactoring code if your application changes that much, but a good OO design should also mean that when changes of that magnitude occur the changes required are limited to relatively small sections of code.

OOP in PHP cannot start with basic building blocks, at least not if you want a system that performs reasonably well.

Right. That makes sense with PHP being an interpreted language. I've tried to offset this somewhat by compiling libraries and having them cached before pages that rely on these libraries load.

I'm trying to get a better idea of how you leverage the advantage of OOP in PHP. Do you use it? If so, how? Do you use any OOP methodologies? If so, which ones? For that matter, how many of your projects start with a detailed description of all data/entities and how they are going to be used?

My general approach to designing a system is data-centric. I tend to start by defining the database schema since getting that clear in my head tends to lead me to a decent design.

For most projects I don't start out with OOP in mind, but my brain is used to building OOP-style systems so nearly everything I do ends up with a few classes.

For example, I'm currently working on a site for a couple of friends of mine. The site has an extremely simple user system - hard-coded passwords (evil I know, but it's what they asked for). When I first came to authenticate the user I naturally created a User class with three static methods: Login, Logout and IsLoggedIn. The class stores the logged in status and access level in the session. When I actually get to implementing something that requires a logged in user I will create another static method called Can which will tell me if a user can do a particular thing.

Off the top of my head, that Can method will look something like...

static public function Can($action)
{
    if (!self::IsLoggedIn())
        return false;

    return (in_array($action, $_SESSION['user']['perms']));
}

For this simple example everything is hard-coded and all data required is stored in that class, including the passwords and actions allowed by each access level.

Now consider that a couple of months down the line they decide they want to implement a complete DB-based user system, all I do is modify the User class to add the methods that would need incorporating getting users from the database. I can do this because I know that each visitor will only be accessing one user at a time so the performance hit is negligible.

If I then go on to create an admin interface for the users, I would create another completely separate class called UserCollection to handle more than one user. I may at that point choose to expose any data-massaging methods in User to UserCollection to avoid code duplication, but that would be the extent of the way UserCollection uses the User class since the User class is optimised to work on a single user at any one time.

Does your experience differ a lot from mine? My customers rarely have a complete understanding of what they'll be doing. They usually only have a general idea. Part of my challenge is to help them define that idea, especially when it comes to defining the scope of the initial project. Yes, scope creep is to be avoided or managed in projects, but customers are always finding new and creative ways to apply their ideas. Things have to be flexible enough to support current needs and future needs. You're saying that you cannot start designing a solution unless you know how the data/entities are going to be used. I'm saying that you have to start somewhere and that code has to be extensible enough to meet growing demands. I'm sure that you try to come up with flexible designs, but I'm wondering. What is your approach?

To me it's all about numbers. I think the worst way you can apply OOP in PHP is by-the-book. What you need to do is look at defining your entities in relation to their existance within each request. Taking my user example above, I know that for the bulk of the system only one user will ever be needed. This makes it perfect for an object-per-record implementation since there is only one record.

When I discuss a system with a customer my head is taking what they are saying and mapping it into several entities, not all of which will become actual classes, but all of which help me organise the site before doing any coding. Examples of these entites would be sections of the site, individual pages, data sets, access limits, etc. and the way those will interact with each other to provide a solution.

All requirements change - fact of life. Customers never know what they really want. OOP will not shield you from the effects of having the system specification pulled from under your feet. However, it can be used to lessen the blow by anticipating what those future changes might be. That comes with experience and no methodology can get completely around it.

Also, isn't OOP supposed to be about separating data from programming logic? If that's the case, isn't how you use that data irrelevant? That seems like one of the greatest promises of OOP, but maybe that's just the hype?

Yes and no. OOP actually brings data and the logic that works on it together, while keeping logic that doesn't work directly on the data awway. One of the core aims of the OOP methodology is to hide as much of the data behind an API that allows the implementation of that API to change without affecting how that API is used.

Having said that, it doesn't apply too much where PHP is concerned unless you are developing a set of classes for public consumption. What is more important is that by packaging data and logic together you end up with one place where it all happens, and you can choose how much of the internal workings are exposed to the rest of the system.

I'd also like to say that OOP itself is not hype. In the same way that podcasts themselves are not hype. It's what surrounds stuff that gives it the uneasy feeling that it's hype. Podcasting is the next stage of audio and video entertainment in the same way that colour TV was all those years ago. They hype exists because of the cruddy media-driven world we now live in where everything has to be hyped up if it's going to be popular, even if it's short-lived.

To relate that twoddle to PHP... OOP is a stable, mature methodology. However, OOP in PHP is fairly new (if you ignore PHP4's pitiful efforts) and there's still a lot of unease about this new kid on the block, along with a lot of hype around the idea that it will launch PHP into being a "real" programming language instead of just a "web-based toy" (can't recall where I read that, otherwise I'd provide a reference).

OOP is good, but it needs to be used where appropriate to the context. OOP should not be used for the sake of it, but it should also not be dismissed as a fad or hype.

On Oct 12, 2006, at 2:29 PM, Richard Lynch wrote:
Rapid prototyping in OOP, if you're willing to chuck the prototyping
if it turns out to be the "wrong" OOP model is do-able.

Do you end up throwing away a lot of code?

I can't speak for Richard, but hell yeah! I've probably thrown away more code than the amount I've written that is still in use. This is a fundamental hurdle that all developers need to get over. Not so prevalent now with the fresh developers arriving in the job market now, but in previous years there were too many who would refuse to throw away any code they had written for what I can only guess are sentimental reasons.

Write it once. Realise that it's ugly and wrong. Write it again. Realise that it's right but could be improved. Write it a third time and you should have a work of art.

If you're not willing to say "that code I just wrote sucks", IMHO you're not a very good developer. In addition, if you're not willing to throw said code away because it "too me hours", IMHO you're not a very good developer.

BTW, this is not related to OOP in the slightest. The same would go for any methodology.

Even building the basic blocks first is fine -- but you've got to have
the whole structure in your mind if you expect those blocks to fit in
well.

It sounds like you (Both Stut and Richard) have done a lot of this, so I'm sure you know what you're talking about. Like I mentioned in my original post, I think I need to spend time learning better object modeling in order to take better advantage of OOP. I still can't help but wonder. How do you know if you have the full structure? Don't you end up going back and changing things a lot?

Yes you do. And you should. If you don't then you've almost certainly done something wrong, probably not tested it enough.

This is probably not really specific to OOP, but I think it tends to
be more obvious with OOP when you start trying to "work around" the
short-sighted architecture.  By which I only mean that in procedural
programming, the work-arounds feel less like work-arounds, at least at
first, as they are not so obviously work-arounds, and just look like
more functions.

I'm honestly not sure if I understand what you're saying here, but I do know that I've always tended more toward linear / procedural programming with a lot of functions. I have used OOP, but in very limited capacity - mainly to avoid the system overhead. I think I've also avoided it because I usually run into problems with defining data in objects - similar to the original issue of creating a customer object only to run into the problem of how to handle objects that represent a collection of customers. Again, me needing to get a better understanding of data modeling in OOP. It seems like you still end up having to learn data modeling "the PHP way"; people are probably critical of PHP because of this, but it seems like there's a middle ground and I'm curious where you guys have found that to be. Should I take this off the mailing list and talk with you about it in separate email?

OOP-based data modelling in PHP cannot be approached in the traditional OOP way for the reasons already mentioned.

To get back to the ORIGINAL point -- OOP is not about raw performance.

It's about maintainability, code re-use, encapsulation, etc.

You can get acceptable performance from OOP if you know what you are
doing -- If you don't, it's super easy for a beginner to write a total
performance hog following all the best practices in the world.

Definitely agree with you there.

I'd quite like an opinion from a Zend Engine developer here. As I've previously mentioned I primarily work with a fairly large OOP-based system but haven't noticed any great performance drain. While it's true that we use Zend Platform on both our development and production servers that's purely due to the sheer number of files involved in each request - something that would still be a problem if it were 100% procedural. And even without the platform enabled it's not particularly sluggish.

Are classes in PHP5 significantly slower than a functional solution?

-Stut

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to