Архитектура приложений

Занятие 14

Профессия
Node.js & React.js developer
продвинутый курс

  • Архитектура приложения: Наследование и модульная архитектура

  • Практические примеры

План

1

Архитектура приложения

Наследование и модульная архитектура

Переиспользование кода

  1. Copy-paste (starter-kit) / GIT
  2. Композиция (NPM) [1, 2]
  3. Наследование 
  4. Higher-Order Components (React) [1]

Наследование

Наследование  — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.

class Items extends Component {
  ... 
  renderItem(item, key) {
    return (
      <div>
        {item.title}
      </div>
    )
  }
  render() {
    return (
      ...
      this.state.items.map(this.renderItem)
      ...
    )
  }
}
class SuperItems extends Items {

  renderItem(item, key) {
    return (
      <div>
        {item.title} - {item.price}$
      </div>
    )
  }
  
}

Композиция

Композиция (агрегирование по значению) — более строгий вариант агрегирования (отношение «часть-целое» между двумя равноправными объектами), когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.


class App {
  logger = require('./logger');
  component = require('./component');
  page = require('./page');
  
} 

HOC

Higher-Order Components

Функция высшего порядка это функция которая может принимать в качестве аргументов другие функции и/или возвращать функции.

const EnhancedComponent = higherOrderComponent(WrappedComponent);


const higherOrderComponent = WrappedComponent =>
  class extends React.Component {
    render() {
      return (
        <WrappedComponent
          {...this.props}
          name={this.state.name}
        />
      )
    }
  }

UML

Unified Modeling Language

унифицированный язык моделирования

 

язык графического описания для объектного моделирования в области разработки программного обеспечения, моделирования бизнес-процессов, системного проектирования и отображения организационных структур.

Проблемы единого кода

Структура классов

Структура классов

наследуемого приложения

Структура классов

наследуемого приложения на практике

Сложности разработки

множества приложений одновременно

Как могло бы быть иначе

Какие могут быть модули

Модульная система

  1. Модули
  2. То, что запускает модули
  3. Хорошо бы, чтобы были подмодули
{
  name: 'App',
  init: () => {
    console.log('App init')
  },
  modules: [{
    name: 'logger',
    init: () => {
      console.log('logger ready')
    },
  }, {
    name: 'db',
    init: () => {
      console.log('database ready')
    },
    modules: [],
  }]
}

Core.getModules

class App2 extends App{
  getModules() {
    return {
       ...super.getModules(),
       upload: undefined,
       auth: require('./otherAuthSystem'),
    };
  }
}

Core - stages

стадии, этапы

await App.start();

// logger
App.constructor();

App.init();

App.modules.Auth.constructor()
App.modules.User.constructor()

App.initModules()

App.modules.Auth.init()
App.afterInit();

App.modules.Auth.afterInit()

App.run();
App.runModules()

App.modules.Auth.run()
App.modules.User.run()

App.afterRun();
App.started();

Структура подключения модулей

 

src/modules

# [folder, git, npm, github, private git]
src/modules/module1
src/modules/module2
node_modules/module3


src/modules/server.js
src/modules/client.js
src/modules/uapp.js

# App.server.js
getModules() {
  return {
    ...super.getModules(),
    ...require('~/modules/server.js').default,
  }
}
# tools/modules.js

export default {
  output: '~/modules',
  modules: {
    rating: 'lsk-rating',
    notification: 'lsk-notification',
    chat: 'lsk-chat',
    auth: 'lsk-auth',
    upload: 'lsk-upload',
    mailer: 'lsk-mailer',
    user: 'lsk-user',
    offer: '~/modules/offer',
    posts: '~/modules/posts',
  },
};

Структура модуля

 

# [entry points]
module1/server.js
module1/client.js
module1/uapp.js
module1/widget.js

# NPM
module1/package.json
module1/node_modules

Структура модуля

 

[entry points]
module1/server.js
module1/client.js
module1/uapp.js
module1/widget.js

module1/package.json
module1/node_modules

2

Практика

наследование и архитектура

  1. lsk/Core

  2. Наследование приложений (сервер, uapp)

  3. Как подменить модуль своим 

  4. Как взять исходный модуль и доопределить его

  5. Как проверить используется ли модуль?

  6. Как использовать компоненты из модулей

  7. Как использовать серверные модели из модулей

  8. Как подключить роутинг из модулей

  9. Сборка проекта как виджета

Практические примеры

  1. lsk/Core

  2. Наследование серверных приложений

  3. Наследование универсальных приложений

  4. React компонентов

  5. CSS

  6. Сборка проекта как библиотеки. Публикация в NPM.

  7. Сборка проекта как виджета.

Как

Игорь Суворов

Thanks!

any questions?

программист-предприниматель

Архитектура приложений

By Igor Suvorov

Архитектура приложений

  • 1,149