There are businesses and people. People could be liked and businesses could be commented on:
class Like class Comment class Person implements iLikeTarget class Business implements iCommentTarget
Likes and comments are performed by a user(person) so they are authored:
class Like implements iAuthored class Comment implements iAuthored
People's like could also be used in their history:
class history class Like implements iAuthored, iHistoryTarget
Now, a smart developer comes and says each history is attached to a user so history should be authored:
interface iHistoryTarget extends iAuthored
so it could be removed from
class Person implements iLikeTarget class Business implements iCommentTarget class Like implements iHistoryTarget class Comment implements iAuthored class history interface iHistoryTarget extends iAuthored
Here, another smart guy comes with a question: How could I capture the
Authored fact in
Comment classes? He may knows nothing about
history concept in the project.
By scalling these kind of functionallities, interfaces may goes to their encapsulated types which cause more type strength, on the other hand explicitness suffered and also code end users will face much pain to process. So here is the question: Should I encapsulate those dependant types to their parent types (interface hierarchies) or not or explicitly repeat each type for every single level of my type system or ...?