# 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."
