Grzegorz Korba Profile picture
Dec 4 β€’ 8 tweets β€’ 3 min read
πŸ’‘Value Object: what's that?

Basically, it's a simple object representation of some kind of reusable data structure. Unlike entity, it does not have identity, so value objects are considered as equal if underlying data is equal.

Want to know more? Read below πŸ‘‡πŸ§΅ #architecture Value Object representing name
Value Objects encapsulate data and ensure its validity - constructor can, and should, check if provided primitive values are correct. Thanks to that, when you pass VO to other methods, you can be sure it carries proper information πŸ™‚
Value Object's reusability doesn't mean you reuse data it carries. You reuse its structure across other Value Objects or Entities. Name can be used for modelling Employee, Client and other.

So you can have several John Doe employees with the same Name, but different Id πŸ™‚ Examples of `Name` Value Object usage
How do you name attributes, methods, if you use private attributes with getters or public, readonly attributes does not matter. What matters is that you should model self-contained, reusable structure that carries data which is always valid for further usage.
Since Value Object is a domain concept, you should mostly use your own models & do not allow 3rd party code to leak into your domain. But in reality you probably don't want to model things that are already done.
So you can use vendor code (or infrastructure, like PHP's), but do it knowingly and with care. Don't populate your domain code with unnecessary dependencies without real added value 😊
This thread is inspired by @PovilasKorop's tweet, which IMHO provides very misleading example of Value Object. Not only `(new FullName('John Doe'))->fullName()` looks weird, but also idea of using external VOs for this is not good.

Let me know if you enjoyed this little thread and tell me how do you use Value Objects in your code 😎 I would happily discuss it!

β€’ β€’ β€’

Missing some Tweet in this thread? You can try to force a refresh
γ€€

Keep Current with Grzegorz Korba

Grzegorz Korba Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @_Codito_

Dec 5
πŸ€” Dictionaries: should they be in the database? πŸ€”

Dictionary is set of values that are supported in your application. But how they should be defined? Well, as always, it depends πŸ˜‰ #PHP #architecture

Let me tell you what I think about it πŸ‘‡πŸ§΅
In general, I believe there are two types of dictionaries:

1) Internal, related to your app's logic
2) UI-managable, related to app instance's data

Let's look about difference between them πŸ™‚
Internal dictionaries are represented in the code. With #PHP 8.1+ it's pretty straightforward - you can use enums πŸ™‚ When you need to represent some state, string-backed enum is the best choice, because it's much better for debugging purposes. PHP 8.1 string-backed enum
Read 18 tweets
Aug 24
There were many discussions if #Laravel's facades implement GoF's Facade Pattern, but I think it does not matter at this point - the team won't change naming convention anyway. Naming is not a problem, I see other issues with facades - a #PHP thread 🧡
1) They're basically magic πŸͺ„ Some may see it as advantage, but I consider it as drawback. You don't execute exact code you're calling, but your call is proxied to some underlying service. It strictly couples your code with the framework, which handles it.
Facades' API has to be added as comments in PHPDoc (with `@Method`) which is error prone because it's easy to forget to update facade's phpdoc when underlying service (accessor) is changed. But even if autocompletion in IDE works, you just can't simply navigate to method's code.
Read 18 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(