Object Oriented Design: Where to place behavior that pertains to more than one type of object?Implications of handles between formsHow is encapsulation used for safety?Object Oriented DesignIs my class structure good enough?Determining a class structureObject Oriented Analysis and Design and DDD togetherHow to manage single responsibility when the responsibility is shared?In a .NET Windows Forms app with a custom MVC, should a custom UserControl (view) implement any non-animating logic on its own?Recreating complex aggregates from a persistance source
Does python reuse repeated calculation results?
Fair Use of Photos as a Derivative Work
An example of a "regular poset" which does not belong to a convex polytope
Proof of bound on optimal TSP tour length in rectangular region
Can/should you swim in zero G?
Choice of solvent during thin layer chromatography
What benefits are there to blocking most search engines?
Injection from two strings to one string
Can someone identify this old round connector?
Search for something difficult to count/estimate
As an interviewer, how to conduct interviews with candidates you already know will be rejected?
Has Boris Johnson ever referred to any of his opponents as "traitors"?
In 1700s, why was 'books that never read' grammatical?
What is /dev/null and why can't I use hx on it?
Mac no longer boots
When can this condition on linear codes be satisfied?
Vim freezes after Ctrl-S
Are there any tricks to pushing a grand piano?
Does every Ubuntu question answer apply to it's derivatives? (Xubuntu, Lubuntu, Kubuntu)
Conveying the idea of "down the road" (i.e. in the future)
What's the difference between motherboard and chassis?
Determine the Winner of a Game of Australian Football
How do I know how many sub-shells deep I am?
Does the DOJ's declining to investigate the Trump-Zelensky call ruin the basis for impeachment?
Object Oriented Design: Where to place behavior that pertains to more than one type of object?
Implications of handles between formsHow is encapsulation used for safety?Object Oriented DesignIs my class structure good enough?Determining a class structureObject Oriented Analysis and Design and DDD togetherHow to manage single responsibility when the responsibility is shared?In a .NET Windows Forms app with a custom MVC, should a custom UserControl (view) implement any non-animating logic on its own?Recreating complex aggregates from a persistance source
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty
margin-bottom:0;
I have been trying to learn Object Oriented Design, but I find it very difficult to decide where to put behavior that deals with more than one type of object.
For example, I am building a REST API, it has User
and Event
entities.
Users can register for events.
Where to put registerUserForEvent(String userid, String eventid)
and getRegisteredEventsForUser(String userid)
?
registerUserForEvent()
:
If I put it in User
class, it will have to know about how to check an event with given String eventId
exists in the DB.
Vice versa if I put it in Event
class.
getRegisteredEventsForUser()
:
This one is even harder, as this requires a JOIN
in SQL (or an aggregate pipeline in MongoDB), which will need to know the internals of both User
and Event
classes. This leads to breaking encapsulation right?
So, what is the best way to model this in OO?
object-oriented object-oriented-design
New contributor
add a comment
|
I have been trying to learn Object Oriented Design, but I find it very difficult to decide where to put behavior that deals with more than one type of object.
For example, I am building a REST API, it has User
and Event
entities.
Users can register for events.
Where to put registerUserForEvent(String userid, String eventid)
and getRegisteredEventsForUser(String userid)
?
registerUserForEvent()
:
If I put it in User
class, it will have to know about how to check an event with given String eventId
exists in the DB.
Vice versa if I put it in Event
class.
getRegisteredEventsForUser()
:
This one is even harder, as this requires a JOIN
in SQL (or an aggregate pipeline in MongoDB), which will need to know the internals of both User
and Event
classes. This leads to breaking encapsulation right?
So, what is the best way to model this in OO?
object-oriented object-oriented-design
New contributor
add a comment
|
I have been trying to learn Object Oriented Design, but I find it very difficult to decide where to put behavior that deals with more than one type of object.
For example, I am building a REST API, it has User
and Event
entities.
Users can register for events.
Where to put registerUserForEvent(String userid, String eventid)
and getRegisteredEventsForUser(String userid)
?
registerUserForEvent()
:
If I put it in User
class, it will have to know about how to check an event with given String eventId
exists in the DB.
Vice versa if I put it in Event
class.
getRegisteredEventsForUser()
:
This one is even harder, as this requires a JOIN
in SQL (or an aggregate pipeline in MongoDB), which will need to know the internals of both User
and Event
classes. This leads to breaking encapsulation right?
So, what is the best way to model this in OO?
object-oriented object-oriented-design
New contributor
I have been trying to learn Object Oriented Design, but I find it very difficult to decide where to put behavior that deals with more than one type of object.
For example, I am building a REST API, it has User
and Event
entities.
Users can register for events.
Where to put registerUserForEvent(String userid, String eventid)
and getRegisteredEventsForUser(String userid)
?
registerUserForEvent()
:
If I put it in User
class, it will have to know about how to check an event with given String eventId
exists in the DB.
Vice versa if I put it in Event
class.
getRegisteredEventsForUser()
:
This one is even harder, as this requires a JOIN
in SQL (or an aggregate pipeline in MongoDB), which will need to know the internals of both User
and Event
classes. This leads to breaking encapsulation right?
So, what is the best way to model this in OO?
object-oriented object-oriented-design
object-oriented object-oriented-design
New contributor
New contributor
New contributor
asked 9 hours ago
happycoder97happycoder97
213 bronze badges
213 bronze badges
New contributor
New contributor
add a comment
|
add a comment
|
1 Answer
1
active
oldest
votes
Very often, when you have a behavior where you cannot decide which of two objects should have it, that is because either
- the two objects should actually be one object or
- there is a third object missing.
A great example is the classic "Bank account" that is so often used as an introduction to OO. In the typical example, balance
is data and deposit
is an operation. This leads to all sorts of problems, but the one we are focusing on here is: where do you put the transfer
method? If a
transfers money to b
, should it be a.transfer(b, amount)
or b.transfer(a, amount)
? Why would a
even know about b
? Why would b
even know about a
? Why would either of the two even know how to transfer money?
However, that is actually not how banking works in real-life and is also not how banking systems are typically designed.
In the real-world, deposit
is actually data (it is a transaction slip) and balance
is an operation (summing up all transaction slips for one account). This is the way banking was done for hundreds of years, and it is actually also how banking systems are written.
This has some advantages for concurrency (now, both Account
s and TransactionSlip
s are immutable, and balance
is a pure function). But, it also solves our conundrum above: neither a
nor b
know how to transfer money, the bank knows that. transfer
is now actually new TransactionSlip(a, b, amount)
.
Back to your specific example: it looks like what you are missing is at least one object, possibly even two:
Registration
: Encapsulates the fact of a user being registered for an eventRegistry
: contains allRegistration
s
This is nice. But how to solve the problem ofgetRegisteredEventsForUser()
? If I don't break encapsulation by doing ajoin
, I will end up doing N+1 queries right?
– happycoder97
5 hours ago
1
The additional missing entity described here is not only a problem of your Object-Oriented Design, it is also a problem for your underlying database. The database should not only have aUsers
and anEvents
Table, it should also have aUserEventRegistrations
Table acting as the associative entity, in order to be in first normal form. Then, querying this table should pose no problem. If you storeEventID
s in theUsers
table and/or vice versa, then yes, you would probably need N+1 queries.
– Vector Zita
4 hours ago
@VectorZita But even after creating aUserEventRegistrations
table, it would still have to do joins or N+1 queries right?
– happycoder97
4 hours ago
1
Well, minimally, the table contains the fields (for example) [RegistrationID, UserID, EventID]. For each new registration, the table contains one record. Retrieving all events for a user or all users for an event are single-queries into that table, i.e. "select all [RegistrationID, EventID] from UserEventRegistrations, where UserID is John Doe".
– Vector Zita
3 hours ago
1
By "seats" you mean "how many users are left to register to the event" as in "each event has a limited number of potential listeners"? If so, there are various ways to deal with this type of concern. One of them, for example, is to actively track this number for each event, within your O-O design, i.e. maintain a map holding the number of users that are registered for each event. Upon every new event registration, the count will be increased for that event. This way, you don't need to calculate anything, yourremaining_seats
per event is always up-to-date, inside the map.
– Vector Zita
1 hour ago
|
show 2 more comments
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "131"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
happycoder97 is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f399053%2fobject-oriented-design-where-to-place-behavior-that-pertains-to-more-than-one-t%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Very often, when you have a behavior where you cannot decide which of two objects should have it, that is because either
- the two objects should actually be one object or
- there is a third object missing.
A great example is the classic "Bank account" that is so often used as an introduction to OO. In the typical example, balance
is data and deposit
is an operation. This leads to all sorts of problems, but the one we are focusing on here is: where do you put the transfer
method? If a
transfers money to b
, should it be a.transfer(b, amount)
or b.transfer(a, amount)
? Why would a
even know about b
? Why would b
even know about a
? Why would either of the two even know how to transfer money?
However, that is actually not how banking works in real-life and is also not how banking systems are typically designed.
In the real-world, deposit
is actually data (it is a transaction slip) and balance
is an operation (summing up all transaction slips for one account). This is the way banking was done for hundreds of years, and it is actually also how banking systems are written.
This has some advantages for concurrency (now, both Account
s and TransactionSlip
s are immutable, and balance
is a pure function). But, it also solves our conundrum above: neither a
nor b
know how to transfer money, the bank knows that. transfer
is now actually new TransactionSlip(a, b, amount)
.
Back to your specific example: it looks like what you are missing is at least one object, possibly even two:
Registration
: Encapsulates the fact of a user being registered for an eventRegistry
: contains allRegistration
s
This is nice. But how to solve the problem ofgetRegisteredEventsForUser()
? If I don't break encapsulation by doing ajoin
, I will end up doing N+1 queries right?
– happycoder97
5 hours ago
1
The additional missing entity described here is not only a problem of your Object-Oriented Design, it is also a problem for your underlying database. The database should not only have aUsers
and anEvents
Table, it should also have aUserEventRegistrations
Table acting as the associative entity, in order to be in first normal form. Then, querying this table should pose no problem. If you storeEventID
s in theUsers
table and/or vice versa, then yes, you would probably need N+1 queries.
– Vector Zita
4 hours ago
@VectorZita But even after creating aUserEventRegistrations
table, it would still have to do joins or N+1 queries right?
– happycoder97
4 hours ago
1
Well, minimally, the table contains the fields (for example) [RegistrationID, UserID, EventID]. For each new registration, the table contains one record. Retrieving all events for a user or all users for an event are single-queries into that table, i.e. "select all [RegistrationID, EventID] from UserEventRegistrations, where UserID is John Doe".
– Vector Zita
3 hours ago
1
By "seats" you mean "how many users are left to register to the event" as in "each event has a limited number of potential listeners"? If so, there are various ways to deal with this type of concern. One of them, for example, is to actively track this number for each event, within your O-O design, i.e. maintain a map holding the number of users that are registered for each event. Upon every new event registration, the count will be increased for that event. This way, you don't need to calculate anything, yourremaining_seats
per event is always up-to-date, inside the map.
– Vector Zita
1 hour ago
|
show 2 more comments
Very often, when you have a behavior where you cannot decide which of two objects should have it, that is because either
- the two objects should actually be one object or
- there is a third object missing.
A great example is the classic "Bank account" that is so often used as an introduction to OO. In the typical example, balance
is data and deposit
is an operation. This leads to all sorts of problems, but the one we are focusing on here is: where do you put the transfer
method? If a
transfers money to b
, should it be a.transfer(b, amount)
or b.transfer(a, amount)
? Why would a
even know about b
? Why would b
even know about a
? Why would either of the two even know how to transfer money?
However, that is actually not how banking works in real-life and is also not how banking systems are typically designed.
In the real-world, deposit
is actually data (it is a transaction slip) and balance
is an operation (summing up all transaction slips for one account). This is the way banking was done for hundreds of years, and it is actually also how banking systems are written.
This has some advantages for concurrency (now, both Account
s and TransactionSlip
s are immutable, and balance
is a pure function). But, it also solves our conundrum above: neither a
nor b
know how to transfer money, the bank knows that. transfer
is now actually new TransactionSlip(a, b, amount)
.
Back to your specific example: it looks like what you are missing is at least one object, possibly even two:
Registration
: Encapsulates the fact of a user being registered for an eventRegistry
: contains allRegistration
s
This is nice. But how to solve the problem ofgetRegisteredEventsForUser()
? If I don't break encapsulation by doing ajoin
, I will end up doing N+1 queries right?
– happycoder97
5 hours ago
1
The additional missing entity described here is not only a problem of your Object-Oriented Design, it is also a problem for your underlying database. The database should not only have aUsers
and anEvents
Table, it should also have aUserEventRegistrations
Table acting as the associative entity, in order to be in first normal form. Then, querying this table should pose no problem. If you storeEventID
s in theUsers
table and/or vice versa, then yes, you would probably need N+1 queries.
– Vector Zita
4 hours ago
@VectorZita But even after creating aUserEventRegistrations
table, it would still have to do joins or N+1 queries right?
– happycoder97
4 hours ago
1
Well, minimally, the table contains the fields (for example) [RegistrationID, UserID, EventID]. For each new registration, the table contains one record. Retrieving all events for a user or all users for an event are single-queries into that table, i.e. "select all [RegistrationID, EventID] from UserEventRegistrations, where UserID is John Doe".
– Vector Zita
3 hours ago
1
By "seats" you mean "how many users are left to register to the event" as in "each event has a limited number of potential listeners"? If so, there are various ways to deal with this type of concern. One of them, for example, is to actively track this number for each event, within your O-O design, i.e. maintain a map holding the number of users that are registered for each event. Upon every new event registration, the count will be increased for that event. This way, you don't need to calculate anything, yourremaining_seats
per event is always up-to-date, inside the map.
– Vector Zita
1 hour ago
|
show 2 more comments
Very often, when you have a behavior where you cannot decide which of two objects should have it, that is because either
- the two objects should actually be one object or
- there is a third object missing.
A great example is the classic "Bank account" that is so often used as an introduction to OO. In the typical example, balance
is data and deposit
is an operation. This leads to all sorts of problems, but the one we are focusing on here is: where do you put the transfer
method? If a
transfers money to b
, should it be a.transfer(b, amount)
or b.transfer(a, amount)
? Why would a
even know about b
? Why would b
even know about a
? Why would either of the two even know how to transfer money?
However, that is actually not how banking works in real-life and is also not how banking systems are typically designed.
In the real-world, deposit
is actually data (it is a transaction slip) and balance
is an operation (summing up all transaction slips for one account). This is the way banking was done for hundreds of years, and it is actually also how banking systems are written.
This has some advantages for concurrency (now, both Account
s and TransactionSlip
s are immutable, and balance
is a pure function). But, it also solves our conundrum above: neither a
nor b
know how to transfer money, the bank knows that. transfer
is now actually new TransactionSlip(a, b, amount)
.
Back to your specific example: it looks like what you are missing is at least one object, possibly even two:
Registration
: Encapsulates the fact of a user being registered for an eventRegistry
: contains allRegistration
s
Very often, when you have a behavior where you cannot decide which of two objects should have it, that is because either
- the two objects should actually be one object or
- there is a third object missing.
A great example is the classic "Bank account" that is so often used as an introduction to OO. In the typical example, balance
is data and deposit
is an operation. This leads to all sorts of problems, but the one we are focusing on here is: where do you put the transfer
method? If a
transfers money to b
, should it be a.transfer(b, amount)
or b.transfer(a, amount)
? Why would a
even know about b
? Why would b
even know about a
? Why would either of the two even know how to transfer money?
However, that is actually not how banking works in real-life and is also not how banking systems are typically designed.
In the real-world, deposit
is actually data (it is a transaction slip) and balance
is an operation (summing up all transaction slips for one account). This is the way banking was done for hundreds of years, and it is actually also how banking systems are written.
This has some advantages for concurrency (now, both Account
s and TransactionSlip
s are immutable, and balance
is a pure function). But, it also solves our conundrum above: neither a
nor b
know how to transfer money, the bank knows that. transfer
is now actually new TransactionSlip(a, b, amount)
.
Back to your specific example: it looks like what you are missing is at least one object, possibly even two:
Registration
: Encapsulates the fact of a user being registered for an eventRegistry
: contains allRegistration
s
answered 8 hours ago
Jörg W MittagJörg W Mittag
73.1k16 gold badges158 silver badges239 bronze badges
73.1k16 gold badges158 silver badges239 bronze badges
This is nice. But how to solve the problem ofgetRegisteredEventsForUser()
? If I don't break encapsulation by doing ajoin
, I will end up doing N+1 queries right?
– happycoder97
5 hours ago
1
The additional missing entity described here is not only a problem of your Object-Oriented Design, it is also a problem for your underlying database. The database should not only have aUsers
and anEvents
Table, it should also have aUserEventRegistrations
Table acting as the associative entity, in order to be in first normal form. Then, querying this table should pose no problem. If you storeEventID
s in theUsers
table and/or vice versa, then yes, you would probably need N+1 queries.
– Vector Zita
4 hours ago
@VectorZita But even after creating aUserEventRegistrations
table, it would still have to do joins or N+1 queries right?
– happycoder97
4 hours ago
1
Well, minimally, the table contains the fields (for example) [RegistrationID, UserID, EventID]. For each new registration, the table contains one record. Retrieving all events for a user or all users for an event are single-queries into that table, i.e. "select all [RegistrationID, EventID] from UserEventRegistrations, where UserID is John Doe".
– Vector Zita
3 hours ago
1
By "seats" you mean "how many users are left to register to the event" as in "each event has a limited number of potential listeners"? If so, there are various ways to deal with this type of concern. One of them, for example, is to actively track this number for each event, within your O-O design, i.e. maintain a map holding the number of users that are registered for each event. Upon every new event registration, the count will be increased for that event. This way, you don't need to calculate anything, yourremaining_seats
per event is always up-to-date, inside the map.
– Vector Zita
1 hour ago
|
show 2 more comments
This is nice. But how to solve the problem ofgetRegisteredEventsForUser()
? If I don't break encapsulation by doing ajoin
, I will end up doing N+1 queries right?
– happycoder97
5 hours ago
1
The additional missing entity described here is not only a problem of your Object-Oriented Design, it is also a problem for your underlying database. The database should not only have aUsers
and anEvents
Table, it should also have aUserEventRegistrations
Table acting as the associative entity, in order to be in first normal form. Then, querying this table should pose no problem. If you storeEventID
s in theUsers
table and/or vice versa, then yes, you would probably need N+1 queries.
– Vector Zita
4 hours ago
@VectorZita But even after creating aUserEventRegistrations
table, it would still have to do joins or N+1 queries right?
– happycoder97
4 hours ago
1
Well, minimally, the table contains the fields (for example) [RegistrationID, UserID, EventID]. For each new registration, the table contains one record. Retrieving all events for a user or all users for an event are single-queries into that table, i.e. "select all [RegistrationID, EventID] from UserEventRegistrations, where UserID is John Doe".
– Vector Zita
3 hours ago
1
By "seats" you mean "how many users are left to register to the event" as in "each event has a limited number of potential listeners"? If so, there are various ways to deal with this type of concern. One of them, for example, is to actively track this number for each event, within your O-O design, i.e. maintain a map holding the number of users that are registered for each event. Upon every new event registration, the count will be increased for that event. This way, you don't need to calculate anything, yourremaining_seats
per event is always up-to-date, inside the map.
– Vector Zita
1 hour ago
This is nice. But how to solve the problem of
getRegisteredEventsForUser()
? If I don't break encapsulation by doing a join
, I will end up doing N+1 queries right?– happycoder97
5 hours ago
This is nice. But how to solve the problem of
getRegisteredEventsForUser()
? If I don't break encapsulation by doing a join
, I will end up doing N+1 queries right?– happycoder97
5 hours ago
1
1
The additional missing entity described here is not only a problem of your Object-Oriented Design, it is also a problem for your underlying database. The database should not only have a
Users
and an Events
Table, it should also have a UserEventRegistrations
Table acting as the associative entity, in order to be in first normal form. Then, querying this table should pose no problem. If you store EventID
s in the Users
table and/or vice versa, then yes, you would probably need N+1 queries.– Vector Zita
4 hours ago
The additional missing entity described here is not only a problem of your Object-Oriented Design, it is also a problem for your underlying database. The database should not only have a
Users
and an Events
Table, it should also have a UserEventRegistrations
Table acting as the associative entity, in order to be in first normal form. Then, querying this table should pose no problem. If you store EventID
s in the Users
table and/or vice versa, then yes, you would probably need N+1 queries.– Vector Zita
4 hours ago
@VectorZita But even after creating a
UserEventRegistrations
table, it would still have to do joins or N+1 queries right?– happycoder97
4 hours ago
@VectorZita But even after creating a
UserEventRegistrations
table, it would still have to do joins or N+1 queries right?– happycoder97
4 hours ago
1
1
Well, minimally, the table contains the fields (for example) [RegistrationID, UserID, EventID]. For each new registration, the table contains one record. Retrieving all events for a user or all users for an event are single-queries into that table, i.e. "select all [RegistrationID, EventID] from UserEventRegistrations, where UserID is John Doe".
– Vector Zita
3 hours ago
Well, minimally, the table contains the fields (for example) [RegistrationID, UserID, EventID]. For each new registration, the table contains one record. Retrieving all events for a user or all users for an event are single-queries into that table, i.e. "select all [RegistrationID, EventID] from UserEventRegistrations, where UserID is John Doe".
– Vector Zita
3 hours ago
1
1
By "seats" you mean "how many users are left to register to the event" as in "each event has a limited number of potential listeners"? If so, there are various ways to deal with this type of concern. One of them, for example, is to actively track this number for each event, within your O-O design, i.e. maintain a map holding the number of users that are registered for each event. Upon every new event registration, the count will be increased for that event. This way, you don't need to calculate anything, your
remaining_seats
per event is always up-to-date, inside the map.– Vector Zita
1 hour ago
By "seats" you mean "how many users are left to register to the event" as in "each event has a limited number of potential listeners"? If so, there are various ways to deal with this type of concern. One of them, for example, is to actively track this number for each event, within your O-O design, i.e. maintain a map holding the number of users that are registered for each event. Upon every new event registration, the count will be increased for that event. This way, you don't need to calculate anything, your
remaining_seats
per event is always up-to-date, inside the map.– Vector Zita
1 hour ago
|
show 2 more comments
happycoder97 is a new contributor. Be nice, and check out our Code of Conduct.
happycoder97 is a new contributor. Be nice, and check out our Code of Conduct.
happycoder97 is a new contributor. Be nice, and check out our Code of Conduct.
happycoder97 is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Software Engineering Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsoftwareengineering.stackexchange.com%2fquestions%2f399053%2fobject-oriented-design-where-to-place-behavior-that-pertains-to-more-than-one-t%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown