Solid Priciples in Computer Programming
Solid Priciples in Computer Programming
cmake_minimum_required(VERSION 3.9)
project(liskov_substitution)
set(CMAKE_CXX_STANDARD 11)
add_executable(liskov_substitution main.cpp)
target_link_libraries(liskov_substitution ${Boost_LIBRARIES})
boost::lexical_cast
int main()
{
Journal journal{"Dear Diary"};
journal.print();
//journal.save("diary.txt"); NO!
PersistenceManager pm;
pm.save(journal, "diary.txt");
return 0;
}
Open-Closed Principle
struct ProductFilter {
// filtering by color
vector<Product *> by_color(vector<Product *> items, Color color) {
...
}
// filtering by size
vector<Product *> by_size(vector<Product *> items, Size size) {
...
}
https://www.tomdalling.com/blog/software-design/solid-class-design-the-liskov-substitution-principle/
Ejemplo esto asume que todas las aves vuelan
class Bird {
public:
virtual void setLocation(double longitude, double latitude) = 0;
virtual void setAltitude(double altitude) = 0;
virtual void draw() = 0;
};
If an override method does nothing or just throws an exception, then you’re probably violating the LSP.
El drama es que hay que andar buscando que clases violan esta especificacion y hacer arreglos parches.
struct Scanner:IMachine {
void print(Document &doc) override {}
void scan(Document &doc) override {}
void fax(Document &doc) override {}
};
struct IPrinter {
virtual void print(Document &doc) = 0;
};
struct IScanner {
virtual void scan(Document &doc) = 0;
};
struct IFax {
virtual void fax(Document &doc) = 0;
};
Dependency Inversion
It’s not about INJECTION, it’s about forming dependencies between objects.
Aca arriba Research (which is high-level) depends on RelationShipS (which is low-level). Cambios
en RelationShipS pueden estopearlo todo.
struct RelationshipBrowser {
virtual vector<Person> find_all_children_of(const string &name) = 0;
};
y ahora