# Paradigms

[Programming paradigm](https://en.wikipedia.org/wiki/Programming_paradigm) #article - Wikipedia. "**Programming paradigms** are a way to classify [programming languages](https://en.wikipedia.org/wiki/Programming_language) based on their features. Languages can be classified into multiple paradigms."

## Aspect-Oriented Software Development

[Aspect-oriented software development](https://en.wikipedia.org/wiki/Aspect-oriented_software_development) #article - Wikipedia. "In [computing](https://en.wikipedia.org/wiki/Computing), **aspect-oriented software development** (AOSD) is a [software development technology](https://en.wikipedia.org/wiki/Software_development_methodology) that seeks new modularizations of [software systems](https://en.wikipedia.org/wiki/Software_system) in order to isolate secondary or supporting functions from the main program's [business logic](https://en.wikipedia.org/wiki/Business_logic). AOSD allows multiple [concerns](https://en.wikipedia.org/wiki/Concern_\(computer_science\)) to be expressed separately and automatically unified into working systems."

[Cross-cutting concern](https://en.wikipedia.org/wiki/Cross-cutting_concern) #article - Wikipedia. "In [aspect-oriented software development](https://en.wikipedia.org/wiki/Aspect-oriented_software_development), **cross-cutting concerns** are [aspects](https://en.wikipedia.org/wiki/Aspect_\(computer_programming\)) of a [program](https://en.wikipedia.org/wiki/Computer_program) that affect other [concerns](https://en.wikipedia.org/wiki/Concern_\(computer_science\)). These concerns often cannot be cleanly [decomposed](https://en.wikipedia.org/wiki/Modularity_\(programming\)) from the rest of the system in both the design and implementation, and can result in either *scattering* ([code duplication](https://en.wikipedia.org/wiki/Code_duplication)), *tangling* (significant dependencies between systems), or both."

## Functional Programming

[Functional programming](https://en.wikipedia.org/wiki/Functional_programming) #article - Wikipedia. "In [computer science](https://en.wikipedia.org/wiki/Computer_science), **functional programming** is a [programming paradigm](https://en.wikipedia.org/wiki/Programming_paradigm)—a style of building the structure and elements of [computer programs](https://en.wikipedia.org/wiki/Computer_program)—that treats [computation](https://en.wikipedia.org/wiki/Computation) as the evaluation of [mathematical functions](https://en.wikipedia.org/wiki/Function_\(mathematics\)) and avoids changing-[state](https://en.wikipedia.org/wiki/Program_state) and [mutable](https://en.wikipedia.org/wiki/Immutable_object) data. It is a [declarative programming](https://en.wikipedia.org/wiki/Declarative_programming) paradigm in that programming is done with [expressions](https://en.wikipedia.org/wiki/Expression_\(computer_science\)) or declarations[\[1\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-expression_style-1) instead of [statements](https://en.wikipedia.org/wiki/Statement_\(computer_science\)). Functional code is [idempotent](https://en.wikipedia.org/wiki/Idempotence): a function's return value depends only on its [arguments](https://en.wikipedia.org/wiki/Function_argument), so calling a function with the same value for an argument always produces the same result. This is in contrast to imperative programming where, in addition to a function's arguments, global program state can affect a function's resulting value. Eliminating [side effects](https://en.wikipedia.org/wiki/Side_effect_\(computer_science\)), that is, changes in state that do not depend on the function inputs, can make understanding a program easier, which is one of the key motivations for the development of functional programming."

[Functional programming in JavaScript](https://www.youtube.com/playlist?list=PL0zVEGEvSaeEd9hlmCXrk5yUyqUag-n84) #playlist - "This is a collection of the videos from FunFunFunction that is specifically about functional programming in JavaScript"

## Object-Oriented Programming

[Composition vs. Inheritance: How to Choose?](https://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose) #article - "As a heuristic, ‘favor composition over inheritance’ is okay, however, I am [not a fan of mantras](http://programmers.stackexchange.com/a/65209/906). While they often contain a kernel of truth, it is far too easy for people to hear the slogan without understanding its source or context, and thus avoid thinking for themselves - and that never turns out well."

[Dependency Injection basics- Fun Fun Function](https://www.youtube.com/watch?v=0X1Ns2NRfks) #video

[*Dive Into Design Patterns*](https://refactoring.guru/design-patterns/book) #book - "**Design patterns** help you solve commonly-occurring problems in software design. But you can’t just find a pattern and copy it into your program, the way you can with off-the-shelf functions or libraries. A pattern is not a specific piece of code, but a general concept for solving a particular problem. They are like pre-made blueprints that you can customize to solve a recurring design problem in your code."

[Inversion of Control - Fun Fun Function](https://www.youtube.com/watch?v=-kpEP4JeEdc) #video

[Refactoring From Inheritance To Composition To Data](https://www.rubypigeon.com/posts/refactoring-inheritance-composition-data/) #article - "[“Prefer composition over inheritance”](http://www.artima.com/lejava/articles/designprinciples4.html) is a popular saying amongst programmers. In this article, I want to demonstrate what that looks like."


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://brain.nathanarthur.com/programming/paradigms.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
