Coder Social home page Coder Social logo

bespoyasov / solidbook Goto Github PK

View Code? Open in Web Editor NEW
595.0 13.0 60.0 7.75 MB

Book about the SOLID principles and object-oriented software design.

Home Page: https://solidbook.vercel.app

License: MIT License

TypeScript 37.43% JavaScript 0.96% CSS 0.03% MDX 61.58%
oop oop-principles solid srp ocp lsp isp dip di dependency-injection

solidbook's Introduction

Солидбук

Read the description in English. The translation is on the way. Hold tight and stay tuned!

Книга о принципах SOLID и объектно-ориентированном дизайне программ.

О чём это и для кого

Программировать — сложно.

Хороший код адекватно отражает систему, которую описывает, он устойчив к изменениям в этой системе. Плохой код запутанный, хрупкий и непонятный — он замедляет разработку.

Код становится плохим, когда он перестаёт соответствовать реальности — бизнес-требованиям, правилам поведения частей системы, их отношениям друг с другом. Бизнес-правила — это территория, код — карта этой территории. Чем точнее карта, тем проще справляться с изменениями в требованиях и даже предвидеть их.

В этой книге мы хотим рассказать и показать на примерах, как принципы объектно-ориентированного программирования могут помочь спроектировать устойчивую систему.

О каких принципах пойдёт речь?

Мы рассмотрим 5 принципов SOLID, а именно:

Каждый из принципов — это лишь рекомендация, все они имеют область и границы применения. Но чтобы увидеть эти границы, необходимо понять, в чём польза и издержки каждого. Многие принципы вам покажутся чрезмерно абстрактными, неконкретными или вовсе надуманными. Отнеситесь к таким принципам, как к дзену Python — держите в голове, но проверяйте, насколько они полезны в конкретной ситуации.

Мы в этой книге предлагаем ещё одну из бесконечного числа интерпретаций этих принципов, попутно расписывая пользу и ограничения каждого. Зная пользу и ограничения, можно оценить, насколько конкретный принцип помогает решить задачу, стоящую перед вами.

Об авторах

Эту книжку написали:

...И контрибьюторы проекта ❤️

Лицензии

Текст и иллюстрации книги распространяются под лицензией CC BY-NC-SA 4.0. Вы можете дополнять, менять и использовать их в проектах на некоммерческой основе при сохранении лицензии и указании авторов.

Исходный код проекта распространяется под лицензией MIT.

solidbook's People

Contributors

artembert avatar baitun avatar bespoyasov avatar bkoshelev avatar bohdanstefaniuk avatar brickrint avatar corocoto avatar delimitry avatar dependabot[bot] avatar dex157 avatar dskecse avatar eugeno avatar gebeto avatar goooseman avatar greetclock avatar justerror avatar kondenko avatar lex111 avatar nikitait avatar pongo avatar rimlin avatar ruslan-zhuba avatar shramkoweb avatar tenorok avatar timurioo avatar vansosnin avatar voyager101pw avatar wdyffs avatar zarwlar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

solidbook's Issues

Текст: раздел DI

  • Введение
  • В идеальном мире
  • В реальной жизни
  • Шаблоны
  • Антипаттерны
  • Ограничения и подводные камни
  • Просушить текст, добавить мяса
  • Проверить грамматику, орфографию

Текст: раздел ISP

  • Введение
  • В идеальном мире
  • В реальной жизни
  • Шаблоны
  • Антипаттерны
  • Ограничения и подводные камни
  • Просушить текст, добавить мяса
  • Проверить грамматику, орфографию

Создать готовую структуру

@bespoyasov, возникла еще такая идея, создать скелет проекта по разделам, и просто закинуть везде, где нет текста плашку WIP, как это сделано у зейтов в доке mdxjs.

Так можно будет заранее видеть и размеры навигации и примерно представлять что где будет.

Еще я посмотрел вчера доку nextjs и там слева навигация ооочень большая, мне кажется это будет вызывать трудности, если навигация будет содержать еще и очки. Или не будет, и я надумываю, в общем мне сложно принимать решение, я видимо фигму рачехлю, и накидаю примеры для сравнения

Wrong code example on "srp/in-ideal-world" page

Вопрос к примеру из главы https://ota-solid.now.sh/srp/in-ideal-world

В первом блоке кода следующий пример:

// класс, который занимается экспортом данных
class ReportExporter {
  name: string
  data: ReportData

  constructor(name: string, data: ReportData) {
    this.name = name
    this.data = data
  }

  export(reportType: ReportTypes): string {
    const formatter: Formatter = new FormatSelector(reportType, this.data)
    return formatter.format()
  }
}
  1. У FormatSelector мы вызываем конструктор с двумя переменными reportType и this.data
  2. Затем вызывает formatter.format() без аргументов

Но конструктор FormatSelector принимает только одну переменную:

class FormatSelector {
  formatters = {
    [ReportTypes.Html]: HtmlFormatter,
    [ReportTypes.Txt]: TxtFormatter,
  }

  constructor(reportType: ReportTypes) {
    const FormatterFactory = this.formatters[reportType]
    return new FormatterFactory()
  }
}

const dynamicFormatter = new FormatSelector(ReportTypes.Html)
dynamicFormatter.format(/*...*/)

А метод format принимает data:

interface Formatter {
  format(data: ReportData): string;
}

Cпринт 12.03.19-19.03.19

  • сделать конспект по Мартину #17
  • добавить Мартина в текст #16
  • mdx provider code => Code #15
  • перенести текст из гуглдоков в код #14
  • адаптив к сетке на гридах #13
  • подумать над дизайном меню #12
  • подключить mobx-state-tree #18

Текст: open-closed раздел

  • введение
  • примеры из идеального мира
  • в реальной жизни
  • шаблоны
  • антипаттерны
  • подводные камни
  • просушить текст
  • добавить мяса, если потребуется

Текст: раздел LSP

  • Введение
  • В идеальном мире
  • В реальной жизни
  • Шаблоны
  • Антипаттерны
  • Ограничения и подводные камни
  • Просушить текст, добавить мяса
  • Проверить грамматику, орфографию

`interface Formatter` - почему данные передаются в конструктор, а не в `format()`?

Вопрос к примеру из главы https://ota-solid.now.sh/srp/in-ideal-world/

В примере описан interface Formatter и несколько реалзиаций этого интерфейса, например HtmlFormatter:

interface Formatter {
  data: ReportData;
  format(): string;
}

// класс для форматирования в HTML
class HtmlFormatter implements Formatter {
  data: ReportData

  constructor(data: ReportData) {
    this.data = data
  }

  format(): string {
    // форматируем данные в HTML и возвращаем:
    return 'html string'
  }
}

Мой опыт изучения паттернов в различных источках подсказывает, что если речь идёт не о сущности (Entity), а об утилитарном классе типа Formatter, то "правильнее" было бы передавать данные непосредственно в метод format(), а параметры конструктора использовать лишь для конфигурации (в данном случае конфигурации нет).
Исправленный пример:

interface Formatter {
  format(data: ReportData): string;
}

// класс для форматирования в HTML
class HtmlFormatter implements Formatter {
  format(data: ReportData): string {
    // форматируем данные в HTML и возвращаем:
    return 'html string'
  }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.