From a1dfee0f4c6152fff20c9613795ed08c70b9a454 Mon Sep 17 00:00:00 2001 From: Hayden Hargreaves Date: Thu, 6 Nov 2025 22:49:16 -0700 Subject: [PATCH] (JOURNAL): Began working on the SOLID article! --- .gitignore | 4 +- flake.nix | 41 +++ src/journal/SOLID: Does They Matter.md | 270 ++++++++++++++++++ ... Programming Language: Featuring Elixir.md | 15 +- static/journal/SOLID.png | Bin 0 -> 34513 bytes 5 files changed, 316 insertions(+), 14 deletions(-) create mode 100644 flake.nix create mode 100644 src/journal/SOLID: Does They Matter.md create mode 100644 static/journal/SOLID.png diff --git a/.gitignore b/.gitignore index ea097fa..57010a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ node_modules .idea +flake.lock +bun.lockb # Output .output @@ -24,5 +26,3 @@ vite.config.js.timestamp-* vite.config.ts.timestamp-* -# Jet brains -.idea \ No newline at end of file diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..d9c36df --- /dev/null +++ b/flake.nix @@ -0,0 +1,41 @@ +{ + description = "Bun development flake. Adjust as needed"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { inherit system; }; + in + { + # Define the development shell. + # When you run `nix develop` (or direnv activates), you'll enter this shell. + devShells.default = pkgs.mkShell { + # List all the development tools you need available in this shell's PATH. + packages = with pkgs; [ + # Add packages here... + bun + ]; + + # Define the shell that will be executed. + # Here, we explicitly use zsh. + # Note: pkgs.zsh needs to be included in `packages` or `nativeBuildInputs` + # for it to be found in the shell's environment. `inherit pkgs.zsh;` is concise. + inherit (pkgs) zsh; + + # Environment variables and commands to run when the shell starts. + shellHook = '' + # Add any exports, hooks, aliases, or anything else here + + # Exec zsh to replace the current shell process with zsh. + # This ensures your prompt and zsh configurations load correctly. + exec zsh + ''; + }; + } + ); +} diff --git a/src/journal/SOLID: Does They Matter.md b/src/journal/SOLID: Does They Matter.md new file mode 100644 index 0000000..9de47f1 --- /dev/null +++ b/src/journal/SOLID: Does They Matter.md @@ -0,0 +1,270 @@ +Date: 2025-11-?? +Desc: SOLID principles are very well known, but are they really that important? +# SOLID: Do They Matter + +Solid principles guide + +###### Image source: [Geeks for Geeks](https://www.geeksforgeeks.org/system-design/solid-principle-in-programming-understand-with-real-life-examples/) +
+ +###### Author: Hayden Hargreaves + +###### Published: 11/??/2025 + +## Background + +If you have not heard of the SOLID principles, you are in the right place! SOLID is an acronym for +the first five **object-oriented design** (OOD) principles, invented by Robert C. Martin who is commonly +known as [Uncle Bob](https://en.wikipedia.org/wiki/Robert_C._Martin). The goal of the SOLID principles is to establish best practices for developing +maintainable and extensible software. Adapting these principles into your own code can help you avoid +[code smells](https://en.wikipedia.org/wiki/Code_smell), refactor code and develop Agile software. + +> +> "If you think good architecture is expensive, try bad architecture." ~Uncle Bob +> + +The five principles are as follows: +- **S** - Single-responsibility Principle +- **O** - Open-closed Principle +- **L** - Liskov Substitution Principle +- **I** - Interface Segregation Principle +- **D** - Dependency Inversion Principle + +This article will serve as an *introduction*, not a complete guide. However, a simple understanding +of the principles can help you level up as a developer! + + +## Object-Oriented Programming Refresher + +Some basic knowledge of object-oriented programming (OOP) is expected for best success when reading this +article. Regardless, a simple refresher can't hurt! Object-oriented programming is exactly as it sounds, +**object based programming.** Code written in OOP languages is organized into "objects", which are self-contained +units that combine data (attributes) and functions that operate on the data (methods). The OOP approach +*can* simplify complex systems, promote code reusability and modularity which makes OOP code easier to +maintain and scale. There are four main principles of object-oriented principles: **encapsulation**, +**inheritance**, **abstraction** and **polymorphism**. I will write a dedicated article about these four +principles soon, which will also be found here in my journal. + +To understand the SOLID principles, the most important thing to remember is **what a class is;** a +class is a blueprint or template for creating objects. An object is a unique instance of a class. + + +There are many object-oriented languages and the concepts taught in this article are not unique to a +specific language, they can be applied to any language which implements OOP structure (even Python!). +Some languages include: **[C++](https://en.wikipedia.org/wiki/C%2B%2B)**, **[C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language))**, **[Java](https://en.wikipedia.org/wiki/Java_(programming_language))**, **[Ruby](https://en.wikipedia.org/wiki/Ruby_(programming_language))**, and more. The examples provided in this article +will be in C++, but as mentioned previously, they apply to any OOP language! + +## Single-Responsibility Principle + +The **[Single-Responsibility Principle](https://en.wikipedia.org/wiki/Single-responsibility_principle)** states: + +> +> "A class should have one and only one reason to change, meaning that a class should have only one +> job." ~Robert "Uncle Bob" Martin +> + +### The Misunderstood Principle + +The SRP is the simplest, yet most commonly misunderstood principle. The goal of the SRP is to **prevent +unexpected side effects** by keeping each *unit* (class) simple and with only a single purpose. A class +that has many responsibilities will frequently need to be changed as requirements change, which can +lead to more bugs. When a class is changed, it can impact classes that depend on it, which can result +in unexpected bugs in code that did not *seem* to change. However, a class with a **single responsibility** +will be changed much less, reducing the number of sneaky bugs that result from code refactors. + + +### Easier to Understand + +Another benefit of implementing the single-responsibility principle is that resulting code becomes much +easier to understand. A class that has a single purpose is much easier to explain to a co-worker or intern. +However, this is another common place of misunderstanding. Some developers take the SRP a bit too far +and **over-simplify** their code, for example: writing a new class for each function!? When they later +want to write some real code, they need to inject dozens of dependencies just to achieve a single task! + +There exists a healthy balance of responsibility and simplicity, which can be hard to understand at first. +The best thing you can do is keep the SRP in mind, but not follow it **too strictly**. Do not use it as +your "programming bible." Use common sense, there is no point in classes that only contain a single function! + +### Code Example + +To display this concept we will look at a **Shape** class which needs to be draw to an output. Below +is an implementation which does not adhere to the single-responsibility principle. + +```cpp +class Shape { +public: + Shape(double w, double h) : width(w), height(h) {}; + + // Responsibility 1: Core Business Logic (Math) + double calculateArea() const { + return this->width * this->height; + } + + // Responsibility 2: Presentation/Output (Drawing) + void draw() const { + // Imagine complex rendering code here... + std::cout << "Drawing a rectangle of size " << this->width << "x" + << this->height << "\n"; + } + +private: + double width; + double height; +}; +``` + +However, as the comments note, this class has more than one responsibility. The class is responsible +for storing shape data and computing the area as well as rendering it to the output. Imagine we have +hundreds of shapes, we don't want to write hundreds of different ways to render each shape! This +example is a tad simple, but it helps us understand why we need to split responsibilities as code scales. + +To fix this, we can create a **ShapeRenderer** class and simplify our **Shape** class. + +```cpp +// 1. ShapeSRP: Responsibility = Core Business Logic ONLY (Data and Math) +class ShapeSRP { +public: + ShapeSRP(double w, double h) : width(w), height(h) {} + + // Methods for data access and core calculation + double getWidth() const { return width; } + double getHeight() const { return height; } + + // Stays here as it's the core purpose of the data + double calculateArea() const { + return width * height; + } + +private: + double width; + double height; +}; + +// 2. ShapeRenderer: Responsibility = Presentation/Output ONLY +class ShapeRenderer { +public: + // This class's sole job is to handle how the Shape is visualized. + void draw(const ShapeSRP& shape) const { + // The rendering logic is isolated here. + std::cout << "--- Graphics Renderer Output ---\n"; + std::cout << "Drawing a shape with area: " << shape.calculateArea() << "\n"; + std::cout << "Using dimensions: " << shape.getWidth() << "x" << shape.getHeight() << "\n"; + } +}; +``` + +Now we have successfully implemented a scalable and modular class which can be used by many shapes! +Using polymorphism we can achieve an even better solution, which is not the focus of this article, but +further encourages the idea. + +```cpp +#include +#include + +// 1. Abstract Base Class: Defines the contract for all shapes +class Shape { +public: + // Core Business Logic: Must be implemented by derived classes + virtual double calculateArea() const = 0; + + // Virtual destructor is crucial for proper cleanup with polymorphism + virtual ~Shape() = default; +}; + +// Concrete Shape 1: Rectangle +class Rectangle : public Shape { +public: + Rectangle(double w, double h) : width(w), height(h) {} + + // Implements the specific area calculation for a rectangle + double calculateArea() const override { return width * height; } + + // Getters needed for the renderer + double getWidth() const { return width; } + double getHeight() const { return height; } + +private: + double width; + double height; +}; + +// Concrete Shape 2: Circle +class Circle : public Shape { +public: + Circle(double r) : radius(r) {} + + // Implements the specific area calculation for a circle + double calculateArea() const override { return M_PI * radius * radius; } + + // Getters needed for the renderer + double getRadius() const { return radius; } + +private: + double radius; +}; + +// Renderer Interface (Contract for drawing) +class Renderer { +public: + // The renderer must be able to handle any kind of Shape + virtual void render(const Shape &shape) const = 0; + virtual ~Renderer() = default; +}; + +// Console Renderer Implementation +class ConsoleRenderer : public Renderer { +public: + void render(const Shape &shape) const override { + std::cout << "\n--- Console Output (Simple) ---\n"; + + // This dynamic_cast is often necessary when a Renderer needs specific data, + // but it's important to keep the logic here, separate from the Shape class! + if (const auto *rect = dynamic_cast(&shape)) { + std::cout << "Type: Rectangle\n"; + std::cout << "Dimensions: " << rect->getWidth() << "x" + << rect->getHeight() << "\n"; + } else if (const auto *circ = dynamic_cast(&shape)) { + std::cout << "Type: Circle\n"; + std::cout << "Radius: " << circ->getRadius() << "\n"; + } else { + std::cout << "Type: Unknown Shape\n"; + } + + // **Polymorphic call:** This works for all shapes! + std::cout << "Calculated Area: " << shape.calculateArea() << "\n"; + } +}; +``` + +This has taken our shape renderer example to new heights! But by now, you should be able to understand +the pros and cons of the **S**ingle-responsibility principle. + + +## Open/Closed Principle + +define the rule +why it exists +what is attempts to achieve + + +## Liskov Substitution Principle +define the rule +why it exists +what is attempts to achieve + + +## Interface Segregation Principle +define the rule +why it exists +what is attempts to achieve + + +## Dependency Inversion Principle +define the rule +why it exists +what is attempts to achieve + +## SOLID Only For OOP? + + +## "Don't Repeat Yourself" From Uncle Bob diff --git a/src/journal/What is a Functional Programming Language: Featuring Elixir.md b/src/journal/What is a Functional Programming Language: Featuring Elixir.md index dd15e84..0ffd67c 100644 --- a/src/journal/What is a Functional Programming Language: Featuring Elixir.md +++ b/src/journal/What is a Functional Programming Language: Featuring Elixir.md @@ -9,7 +9,7 @@ Desc: I have decided to begin the journey of learning functional programming. He ###### Author: Hayden Hargreaves -###### Published: 05/??/2025 +###### Published: 05/21/2025 ## Background @@ -287,17 +287,8 @@ a full stack web application using the Phoenix Framework. This app will allow us a love for cooking and having to store all my recipes in my notes app is cumbersome. Plus, my parents are **amazing** cooks and I would to be able to "borrow" their recipes and save them for myself, without having to copy them manually. - -##### More about the app, and what I liked and hated. - -This article is under construction. Come back later for more! - - ## Elixir Review -After writing a *quality* full stack application I have learned enough about the language to develop an opinion. - -This is what I found... - - +The learning process has been put on pause to focus on work, but when I make it back to +Elixir, I will finish the conclusion! diff --git a/static/journal/SOLID.png b/static/journal/SOLID.png new file mode 100644 index 0000000000000000000000000000000000000000..a184476e35e734970df66ca52db2aaa4cfa1db71 GIT binary patch literal 34513 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≀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 literal 0 HcmV?d00001