├── .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://img.youtube.com/vi/NnQCzhZBN0Y/0.jpg)](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 | Creative Commons License
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 | ![](https://i.imgur.com/j74p7VV.jpg) 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 | ![](https://i.imgur.com/S0O7fy1.png) 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 | ![Imgur](https://i.imgur.com/GFikHFP.jpg) 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 --------------------------------------------------------------------------------