├── .gitignore
├── README.md
└── concepts
├── 001-inception.md
├── 002-objects-and-methods.md
├── 003-methods-and-arguments.md
├── 004-too-many-methods.md
├── 005-too-long-methods.md
├── 006-too-complex-methods.md
├── 007-polymorphism.md
├── 008-null-objects.md
├── 009-structural-complexity.md
├── 010-side-effects.md
├── 011-functions.md
├── 012-execution-flow.md
├── 013-object-variables.md
├── 014-returning-values.md
├── 015-private-methods.md
├── 016-exceptions.md
├── 017-handling-exceptions.md
├── 018-setters-and-getters.md
├── 020-classes.md
├── 021-modules.md
├── 022-namespaces.md
├── 023-active-record-objects.md
├── 030-dependencies.md
├── 031-dependency-inversion.md
├── 032-dependency-injection.md
├── 035-modelling.md
├── 036-encapsulation.md
├── 037-inheritance.md
├── 038-pass-arguments-to-constructor-or-to-method.md
├── 040-declarative-vs-imperative.md
├── 040-implicit-vs-explicit.md
├── 040-levels-of-abstraction.md
├── 040-modularity.md
├── 040-single-responsibility-principle.md
├── 040-specific-vs-vague.md
├── 050-automated-tests.md
├── 051-code-coverage.md
├── 052-linters.md
├── 053-churn-rate.md
├── 054-metaprogramming.md
├── 054-reflection.md
├── 060-chaining.md
├── 060-class-execultion-flow.md
├── 060-class-methods.md
├── 060-functional-objects.md
├── 060-guard-clause.md
├── 090-full-picture.md
├── 091-web-frameworks.md
├── 092-libraries.md
├── 093-gems.md
├── 099-map-vs-terrain.md
├── architecture.md
├── churn-rate.md
├── closures.md
├── code-vs-data.md
├── complex-arguments.md
├── composition.md
├── coupling.md
├── destructuring.md
├── domain-models.md
├── duck-typing.md
├── enumerators.md
├── error-tracing.md
├── execution-paths.md
├── external-world.md
├── factory.md
├── kiss.md
├── layered-architecture.md
├── logging.md
├── mock.md
├── mocks.rb
├── mvc.md
├── price-of-oop.md
├── procs-and-lambdas.md
├── recursion.rb
├── refactoring.md
├── solid.md
├── stateful-stateless.md
├── stubs.md
├── thread-safety.md
├── topology.md
├── types-of-code-in-apps.md
├── types-of-work-in-the-app.md
├── yagni.md
└── yield.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## О проекте
2 |
3 | Цель этого проекта - собрать список концепций связанных с программированием и придумать как их проиллюстрировать.
4 | Примеры таких концепций:
5 |
6 | - Dependency Injection
7 | - Destructuring
8 | - Polymorphism
9 | - Multi dispatch
10 |
11 | Основная идея - придумать непротиворечивую вселеннную (типа как в фантастике), которая бы передавала суть взаимоотношений между объектами, классами, методами и т.д. внутри наших програм.
12 |
13 | Это делается из желания сделать это все менее абстрактными, и как следствие более понятными.
14 |
15 | ## Примеры и что уже есть
16 |
17 | Первые результаты можно увидеть в этом докладе:
18 |
19 | [](https://www.youtube.com/watch?v=NnQCzhZBN0Y)
20 |
21 | [Презентация отдельно](https://speakerdeck.com/inem/solving-architectural-problems-with-oop-in-pictures)
22 |
23 | ## Как устроен репозиторий
24 |
25 | [В папке concepts](https://github.com/inem/visual-oop-guide/tree/master/concepts) собираем список идей и концепций для иллюстрирования. В законченном варианте в файле концепции будет одна или несколько иллюстраций, наглядно ее описывающих.
26 | В черновом сойдет и описание того как эту идею можно попробовать проиллюстрировать.
27 |
28 | ## Как принести пользу проекту
29 |
30 | 1. Создайте issue на добавление какой-то новой концепции. Опционально можно расписать идеи по иллюстрированию или приложить набросок.
31 |
32 | 2. Создайте issue если нашли противоречие в том как проиллюстрирована та или иная концепция
33 |
34 | 3. Вместо issue можно создать сразу Pull Request с исправлением или предложением.
35 |
36 | ## См. еще
37 |
38 | [Little dudes notation](https://github.com/inem/little-dudes-notation)
39 |
40 |
41 | ---
42 |
43 | 
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
44 |
--------------------------------------------------------------------------------
/concepts/001-inception.md:
--------------------------------------------------------------------------------
1 | Plan:
2 | - Task about smart kettle
3 | - Artistic Soldiers method
4 | - Little men (visual) method
5 | - How to draw Dependency Injection?
6 |
7 |
--------------------------------------------------------------------------------
/concepts/002-objects-and-methods.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/003-methods-and-arguments.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/004-too-many-methods.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/005-too-long-methods.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/005-too-long-methods.md
--------------------------------------------------------------------------------
/concepts/006-too-complex-methods.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/006-too-complex-methods.md
--------------------------------------------------------------------------------
/concepts/007-polymorphism.md:
--------------------------------------------------------------------------------
1 | - Один косит под другого
2 | - Выполняет тот же тип работы
3 | - Играет ту же роль
4 | - Мимикирует
5 | - Имеет один и тот же набор рук с тем же набором пальцевч
6 |
7 |
8 | Внутри метода нам неважно кто ты такой. Нам важно чтобы ты нормально отыгрывал свою роль, на которую тебя взяли.
9 | Название роли отображено в названии аргумента.
10 |
--------------------------------------------------------------------------------
/concepts/008-null-objects.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/008-null-objects.md
--------------------------------------------------------------------------------
/concepts/009-structural-complexity.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/009-structural-complexity.md
--------------------------------------------------------------------------------
/concepts/010-side-effects.md:
--------------------------------------------------------------------------------
1 | 1. Pure functions
2 | 2. Dirty functions
3 | 3. Separate one from another
4 | - split to two functions
5 | - find a saparate container for dirty function (?)
--------------------------------------------------------------------------------
/concepts/011-functions.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/011-functions.md
--------------------------------------------------------------------------------
/concepts/012-execution-flow.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/012-execution-flow.md
--------------------------------------------------------------------------------
/concepts/013-object-variables.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/013-object-variables.md
--------------------------------------------------------------------------------
/concepts/014-returning-values.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/014-returning-values.md
--------------------------------------------------------------------------------
/concepts/015-private-methods.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/015-private-methods.md
--------------------------------------------------------------------------------
/concepts/016-exceptions.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/016-exceptions.md
--------------------------------------------------------------------------------
/concepts/017-handling-exceptions.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/017-handling-exceptions.md
--------------------------------------------------------------------------------
/concepts/018-setters-and-getters.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/018-setters-and-getters.md
--------------------------------------------------------------------------------
/concepts/020-classes.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/020-classes.md
--------------------------------------------------------------------------------
/concepts/021-modules.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/021-modules.md
--------------------------------------------------------------------------------
/concepts/022-namespaces.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/022-namespaces.md
--------------------------------------------------------------------------------
/concepts/023-active-record-objects.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/023-active-record-objects.md
--------------------------------------------------------------------------------
/concepts/030-dependencies.md:
--------------------------------------------------------------------------------
1 | 
2 |
--------------------------------------------------------------------------------
/concepts/031-dependency-inversion.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/031-dependency-inversion.md
--------------------------------------------------------------------------------
/concepts/032-dependency-injection.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/032-dependency-injection.md
--------------------------------------------------------------------------------
/concepts/035-modelling.md:
--------------------------------------------------------------------------------
1 | Сравнение с театром. Раздаем роли и расставляем декорации.
2 |
--------------------------------------------------------------------------------
/concepts/036-encapsulation.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/036-encapsulation.md
--------------------------------------------------------------------------------
/concepts/037-inheritance.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/037-inheritance.md
--------------------------------------------------------------------------------
/concepts/038-pass-arguments-to-constructor-or-to-method.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/038-pass-arguments-to-constructor-or-to-method.md
--------------------------------------------------------------------------------
/concepts/040-declarative-vs-imperative.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/040-declarative-vs-imperative.md
--------------------------------------------------------------------------------
/concepts/040-implicit-vs-explicit.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/040-implicit-vs-explicit.md
--------------------------------------------------------------------------------
/concepts/040-levels-of-abstraction.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/040-levels-of-abstraction.md
--------------------------------------------------------------------------------
/concepts/040-modularity.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/040-modularity.md
--------------------------------------------------------------------------------
/concepts/040-single-responsibility-principle.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/040-single-responsibility-principle.md
--------------------------------------------------------------------------------
/concepts/040-specific-vs-vague.md:
--------------------------------------------------------------------------------
1 | Чем конкретнее название класса, тем лучше чувачок сможет вжиться в роль.
--------------------------------------------------------------------------------
/concepts/050-automated-tests.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/050-automated-tests.md
--------------------------------------------------------------------------------
/concepts/051-code-coverage.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/051-code-coverage.md
--------------------------------------------------------------------------------
/concepts/052-linters.md:
--------------------------------------------------------------------------------
1 | Дресс-код/правила этикета
--------------------------------------------------------------------------------
/concepts/053-churn-rate.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/053-churn-rate.md
--------------------------------------------------------------------------------
/concepts/054-metaprogramming.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/054-metaprogramming.md
--------------------------------------------------------------------------------
/concepts/054-reflection.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/054-reflection.md
--------------------------------------------------------------------------------
/concepts/060-chaining.md:
--------------------------------------------------------------------------------
1 | Получается метод объекта ведет себя как конструктор собственного класса, возвращая сам объект.
2 |
3 | Это странно, да. Но это еще раз подчеркивает что это техника не на каждый день, а исключительно ситуационно должна применяться.
4 |
--------------------------------------------------------------------------------
/concepts/060-class-execultion-flow.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/060-class-execultion-flow.md
--------------------------------------------------------------------------------
/concepts/060-class-methods.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/060-class-methods.md
--------------------------------------------------------------------------------
/concepts/060-functional-objects.md:
--------------------------------------------------------------------------------
1 | 
2 |
--------------------------------------------------------------------------------
/concepts/060-guard-clause.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/060-guard-clause.md
--------------------------------------------------------------------------------
/concepts/090-full-picture.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/090-full-picture.md
--------------------------------------------------------------------------------
/concepts/091-web-frameworks.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/091-web-frameworks.md
--------------------------------------------------------------------------------
/concepts/092-libraries.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/092-libraries.md
--------------------------------------------------------------------------------
/concepts/093-gems.md:
--------------------------------------------------------------------------------
1 | pieces of puzzle
--------------------------------------------------------------------------------
/concepts/099-map-vs-terrain.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/099-map-vs-terrain.md
--------------------------------------------------------------------------------
/concepts/architecture.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/churn-rate.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/closures.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/code-vs-data.md:
--------------------------------------------------------------------------------
1 | code:
2 |
3 | ```
4 | def normalize_letter(letter)
5 | return "И" if letter == "Й"
6 | return "Е" if letter == "Ё"
7 | return letter
8 | end
9 | ```
10 |
11 | data:
12 |
13 | ```
14 | def normalize_letter(letter)
15 | identicals = {
16 | "Й" => "И",
17 | "Ё" => "Е",
18 | }
19 |
20 | identicals.fetch(letter, letter)
21 | end
22 | ```
23 |
--------------------------------------------------------------------------------
/concepts/complex-arguments.md:
--------------------------------------------------------------------------------
1 | ```
2 | class C
3 | def hi(needed, maybe1 = "42"
4 | *args,
5 | named1: 'hello', named2: a_method(named1, needed2),
6 | **options,
7 | &block)
8 | end
9 | end
10 | ```
11 |
12 | 
13 |
14 | - http://blog.marc-andre.ca/2013/02/23/ruby-2-by-example/
15 | - https://blog.saeloun.com/2019/10/07/ruby-2-7-keyword-arguments-redesign.html
16 |
--------------------------------------------------------------------------------
/concepts/composition.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/composition.md
--------------------------------------------------------------------------------
/concepts/coupling.md:
--------------------------------------------------------------------------------
1 | Gravity-like effect
2 |
--------------------------------------------------------------------------------
/concepts/destructuring.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/domain-models.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/domain-models.md
--------------------------------------------------------------------------------
/concepts/duck-typing.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/duck-typing.md
--------------------------------------------------------------------------------
/concepts/enumerators.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/error-tracing.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/error-tracing.md
--------------------------------------------------------------------------------
/concepts/execution-paths.md:
--------------------------------------------------------------------------------
1 | Любой if удваивает кол-во execution paths, и порождает руку-базуку.
2 |
3 | Если у вас в методе 5 if-ов, то таких путей 2^5 = 32. По хорошему, каждый неплохо бы протестировать.
4 |
--------------------------------------------------------------------------------
/concepts/external-world.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/external-world.md
--------------------------------------------------------------------------------
/concepts/factory.md:
--------------------------------------------------------------------------------
1 | Класс/модуль (короче какая-то коробочка), метод которой может возвращать объекты разных классов (в зависимости от ситуации).
2 |
3 | Иногда лучшее, что можно сделать с руками-базуками, это утащить их в такую фабрику.
4 |
5 | См доклад Sandi Metz с Deconsctruct 2018
6 |
7 | По сути речь идет о фабричном методе, но да, имеет смысл для этого юзать отдельный контейнер (класс/модуль)
8 |
--------------------------------------------------------------------------------
/concepts/kiss.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/kiss.md
--------------------------------------------------------------------------------
/concepts/layered-architecture.md:
--------------------------------------------------------------------------------
1 | Sources:
2 | - https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ee658109(v=pandp.10)?redirectedfrom=MSDN#presentation-business-and-data-layers
3 |
--------------------------------------------------------------------------------
/concepts/logging.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/logging.md
--------------------------------------------------------------------------------
/concepts/mock.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/mock.md
--------------------------------------------------------------------------------
/concepts/mocks.rb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/mocks.rb
--------------------------------------------------------------------------------
/concepts/mvc.md:
--------------------------------------------------------------------------------
1 |
2 | Важна идея слоев, а не то что это типа просто разные названия классов
3 |
--------------------------------------------------------------------------------
/concepts/price-of-oop.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/procs-and-lambdas.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/procs-and-lambdas.md
--------------------------------------------------------------------------------
/concepts/recursion.rb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/recursion.rb
--------------------------------------------------------------------------------
/concepts/refactoring.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/refactoring.md
--------------------------------------------------------------------------------
/concepts/solid.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/stateful-stateless.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/stateful-stateless.md
--------------------------------------------------------------------------------
/concepts/stubs.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/stubs.md
--------------------------------------------------------------------------------
/concepts/thread-safety.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/topology.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/concepts/types-of-code-in-apps.md:
--------------------------------------------------------------------------------
1 | Прикладной код (непосредственно приложение) vs библиотечный (gems, libs)
2 |
3 | Сервисы - часть прикласдного кода, например.
4 |
--------------------------------------------------------------------------------
/concepts/types-of-work-in-the-app.md:
--------------------------------------------------------------------------------
1 | Полезно подмечать какие-то типовые задачи внутри кода приложения, которые приходится решать, и выносить такой код в отдельные слои.
2 |
3 |
--------------------------------------------------------------------------------
/concepts/yagni.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/yagni.md
--------------------------------------------------------------------------------
/concepts/yield.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inem/visual-oop-guide/d73c2a2f3e15500d77021810eeda6e8b2605005b/concepts/yield.md
--------------------------------------------------------------------------------