Tuesday, December 23, 2014

OO Principles



Encapsulate what varies
Favor composition over inheritance.
Program to interface not to implementations.

Class should be open for extension but closed for modification.
Depend on abstraction, don't depend on concrete classes.

https://martinfowler.com/bliki/EncapsulatedCollection.html
While the get and set convention works for single values, it doesn't do well for multi-valued fields - fields that are collections of values. In this case you need a different accessor scheme. The key point with this is that you don't want to give clients direct access to the collection data structure itself - for if you do it allows clients to alter the supplier's data without the supplier being able to intervene. The whole point of encapsulation is that an object controls access to its data.
To modify a collection field, you usually see specific methods to add an element to a collection, or remove an element to the collection. So if we have a Company class with a collection of employees - we might expect methods addEmployee and removeEmployee. Occasionally you might see asetEmployees method that takes a collection, but usually it is easier to have add and remove methods.
Usually the trickiest area is in the getting side. You don't want to return the actual collection used to store the objects - otherwise people can add and remove the items without using the encapsulating add and remove methods. So what do you return? The best option is a read-only view on the underlying collection. Java's collections library makes this easy with their unmodifiable collection wrappers. Another option, if available, is an iterator that can't update the underlying collection.
If neither of these is available the usual response is to return a copy of the underlying collection. That way if a client modifies it, it has no effect on the real collection. There is a little time overhead in copying the collection, but since this is just a bunch of object references it's hardly ever significant.


Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts