I’m working on a website with a few colleagues and we are having some differences in how we see the class architecture so I’m posting this too see how the larger community feels about this issue because I presume a lot of people were in a similar situation.
We are using an MVC approach with model implemented through active record pattern. One of the models is the “Product” model related to the product table in our database.
The thing is, we have two main types of products – tangible ( type = 1 ) and non-tangible ( type = 2 ). Throughout the code, we’ll have tons of logic related to just this – type of product. ( if tangible do this, if non tangible do that…)
So one approach is – create classes TangibleProduct and NonTangibleProduct and through a factory fetch one or the other. Of course, these classes would have duplicate methods i.e. isTangible() or isNonTangible() would exist in both classes but in one case would return true an in other would return false. (this is just an example ).
I’m expecting to see at least about 30 different methods in classes which will return different values based on product type.
The other approach is to have just one Product class and in each method implement IF blocks and do the logic if product is tangible or non tangible and return results.
I know this is a vague question but I do think that most of the people who are working in an OO environment had a similar situation at some point…
Do you see any long term consequences in choosing one approach over the other, do you see any approach better or worse than the other?
Editing:
Sorry, I might have not been too clear. These two classes would extend the Product class. (i.e. “class TangibleProduct extends Product” and “class NonTangibleProduct extends Product” )
Thanx
Architecturally speaking, since the difference between tangible and intangible products is so fundamental in your domain the best approach is to have separate classes
TangibleProductandIntangibleProductand handle both as instances implementingIProduct(a variation on the first approach). If your ORM tool allows you to do this then it’s all good.The second approach should be avoided very very hard.