Igor Suvorov
Программист-предприниматель
Занятие 14
3 June 2017
Профессия
Node.js & React.js developer
продвинутый курс
Архитектура приложения: Наследование и модульная архитектура
Практические примеры
Наследование и модульная архитектура
Наследование
Наследование — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.
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
унифицированный язык моделирования
язык графического описания для объектного моделирования в области разработки программного обеспечения, моделирования бизнес-процессов, системного проектирования и отображения организационных структур.
наследуемого приложения
наследуемого приложения на практике
множества приложений одновременно
{
name: 'App',
init: () => {
console.log('App init')
},
modules: [{
name: 'logger',
init: () => {
console.log('logger ready')
},
}, {
name: 'db',
init: () => {
console.log('database ready')
},
modules: [],
}]
}
class App2 extends App{
getModules() {
return {
...super.getModules(),
upload: undefined,
auth: require('./otherAuthSystem'),
};
}
}
стадии, этапы
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
наследование и архитектура
lsk/Core
Наследование приложений (сервер, uapp)
Как подменить модуль своим
Как взять исходный модуль и доопределить его
Как проверить используется ли модуль?
Как использовать компоненты из модулей
Как использовать серверные модели из модулей
Как подключить роутинг из модулей
Сборка проекта как виджета
lsk/Core
Наследование серверных приложений
Наследование универсальных приложений
React компонентов
CSS
Сборка проекта как библиотеки. Публикация в NPM.
Сборка проекта как виджета.
any questions?
программист-предприниматель
By Igor Suvorov