рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ: рдПрдХ рдирд┐рд░рд╛рд▓рд╛ рдЦрд┐рд▓реМрдирд╛ рдЬреЛ рд╢реНрд░рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИред рднрд╛рдЧ 1

рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрдерд╛рдХрдерд┐рдд "рдХрд╛рд░реНрдпрд╛рддреНрдордХ" рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдЖрдк рднреА рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рди рдХрд░реЗрдВ!



рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЦрд╛рдорд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рд╕реЗ рд╢реНрд░рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рднрд╛рд░реА рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдПрдЧреАред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЖрдЗрдП рдЬрд╛рдиреЗрдВред

тЦН тЖТ рднрд╛рдЧ реи

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдмрд╣реБрдореБрдЦреА рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ



рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝-рдХреНрд▓рд╛рд╕ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рдПрдмреНрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдЦреНрдд рдФрд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрдИ рдЕрдореВрд░реНрдд рддрдВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдардиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдкрд╛рда рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЬрд▓реНрдж рд╕рдм рдХреБрдЫ рдШрдЯ рдЬрд╛рдПрдЧрд╛ред

рддрдерд╛рдХрдерд┐рдд "рдХрд╛рд░реНрдпрд╛рддреНрдордХ" рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЕрдореВрд░реНрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЧрдгрд┐рддреАрдп рдирд┐рдпрдореЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ (рдпреЗ рдирд┐рдпрдо, рдЬреЛ рдХрд╛рдлреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЖрд╡реЗрджрди рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ, рд╢реИрдХреНрд╖рд┐рдХ рд╕рдВрд╕реНрдерд╛рдиреЛрдВ рдХреА рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рд╕реНрдерд┐рдд рд╣реИ)ред OOP рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЙрди рд╕рднреА рдХрдИ, рдХрдард┐рди рдФрд░ рдЬрдЯрд┐рд▓ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдЧрдарди рдмрдирд╛рддреЗ рд╣реИрдВред

рдирд┐рдореНрди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡реНрдпрд╛рдкрдХ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

import { filter, first, get } from 'lodash/fp';

const filterByType = type =>
  filter( x => x.type === type );

const fruits = [
  { type: 'apple', price: 1.99 },
  { type: 'orange', price: 2.99 },
  { type: 'grape', price: 44.95 }  
];

const getFruitPrice = type => fruits =>
  fruits
  |> filterByType(type)
  |> first
  |> get('price');

const getApplePrice = getFruitPrice('apple');

console.log('apple price', getApplePrice(fruits));

, , !

, .

! - , , , . , , , .



, , , .

, . , , . , , :

class Fruit {
  constructor(type, price) {
    this.type = type;
    this.price = price;
  }
}

class AbstractFruitFactory {
  make(type, price) {
    return new Fruit(type, price);
  }
}

class AppleFactory extends AbstractFruitFactory {
  make(price) {
    return super.make("apple", price);
  }
}

class OrangeFactory extends AbstractFruitFactory {
  make(price) {
    return super.make("orange", price);
  }
}

class GrapeFactory extends AbstractFruitFactory {
  make(price) {
    return super.make("grape", price);
  }
}

class FruitRepository {
  constructor() {
    this.fruitList = [];
  }

  locate(strategy) {
    return strategy.locate(this.fruitList);
  }

  put(fruit) {
    this.fruitList.push(fruit);
  }
}

class FruitLocationStrategy {
  constructor(fruitType) {
    this.fruitType = fruitType;
  }

  locate(list) {
    return list.find(x => x.type === this.fruitType);
  }
}

class FruitPriceLocator {
  constructor(fruitRepository, locationStrategy) {
    this.fruitRepository = fruitRepository;
    this.locationStrategy = locationStrategy;
  }

  locatePrice() {
    return this.fruitRepository.locate(this.locationStrategy).price;
  }
}

const appleFactory = new AppleFactory();
const orangeFactory = new OrangeFactory();
const grapeFactory = new GrapeFactory();

const fruitRepository = new FruitRepository();
fruitRepository.put(appleFactory.make(1.99));
fruitRepository.put(orangeFactory.make(2.99));
fruitRepository.put(grapeFactory.make(44.95));

const appleLocationStrategy = new FruitLocationStrategy("apple");

const applePriceLocator = new FruitPriceLocator(
  fruitRepository,
  appleLocationStrategy
);

const applePrice = applePriceLocator.locatePrice();

console.log("apple", applePrice);

, . тАФ .

. - , .

. , , .



, , . , -.

-, , .

, .

, ┬л┬╗ . , . , , . , .

. :

//  :

// calculator.js:
const isValidInput = text => true;

const btnAddClick = (aText, bText) => {
  if (!isValidInput(aText) || !isValidInput(bText)) {
    return;
  }
}


//  :

// inputValidator.js:
export const isValidInput = text => true;

// calculator.js:
import { isValidInput } from './inputValidator';

const btnAddClick = (aText, bText, _isValidInput = isValidInput) => {
  if (!_isValidInput(aText) || !_isValidInput(bText)) {
    return;
  }
}

тАФ , . , ? тАФ ?

- :

//  :
public class CalculatorForm {
    private string aText, bText;
    
    private bool IsValidInput(string text) => true;
    
    private void btnAddClick(object sender, EventArgs e) {
        if ( !IsValidInput(bText) || !IsValidInput(aText) ) {
            return;
        }
    }
}


//  :
public class CalculatorForm {
    private string aText, bText;
    
    private readonly IInputValidator _inputValidator;
    
    public CalculatorForm(IInputValidator inputValidator) {
        _inputValidator = inputValidator;
    }
    
    private void btnAddClick(object sender, EventArgs e) {
        if ( !_inputValidator.IsValidInput(bText)
            || !_inputValidator.IsValidInput(aText) ) {
            return;
        }
    }
}

public interface IInputValidator {
    bool IsValidInput(string text);
}

public class InputValidator : IInputValidator {
    public bool IsValidInput(string text) => true;
}

public class InputValidatorFactory {
    public IInputValidator CreateInputValidator() => new InputValidator();
}

! , 22. . , , , .



┬л┬╗ - , . тАФ .

- (, , ).

- :

class CountryUserSelectionStrategy {
  constructor(country) {
    this.country = country;
  }
  
  isMatch(user) {
    return user.country === this.country;
  }
}

class UserSelector {
  constructor(repository, userSelectionStrategy) {
    this.repository = repository;
    this.userSelectionStrategy = userSelectionStrategy;
  }
  
  selectUser() {    
    let user = null;

    for (const u in users) {
      if ( this.userSelectionStrategy.isMatch(u) ) {
        user = u;
        break;
      }
    }
    
    return user;
  }
}

const userRepository = new UserRepository();
const userInitializer = new UserInitializer();
userInitializer.initialize(userRepository);

const americanSelectionStrategy = new CountryUserSelectionStrategy('USA');
const americanUserSelector = new UserSelector(userRepository, americanSelectionStrategy);

const american = americanUserSelector.selectUser();

console.log('American', american);

for (const u in users). - , . , , .

, , , , , -. , , ┬л┬╗ :

SELECT * FROM Users WHERE Country=тАЩUSAтАЩ;

, SQL-, - . SQL? - ? , . тАФ , .



- тАФ . ┬л┬╗ . , , , .

. , . , , . . ( ) . , - , garfield.fishHead тАФ , . , , garfield.swim() () garfield.layCaviar() (). , ! , , . , , !

. , . тАФ .



, , . , , . ┬л┬╗. , - . , . тАФ .eat(veggies), , .doHomework(), . тАФ . , , ? , !

, , . Manager. , , , , , , ┬л Netflix ┬╗.

, , ? , , .

- , , , Factory. , , тАФ MonaLisaFactory, WallFactory.

, тАФ ┬л┬╗ , . , .

, , , .



, , , . .

-, - , , . ( ┬л┬╗) . 30 , . - .

тАФ Domain-Driven Design, , . , Resharper, - тАФ .

20-30 . , , 30 , . - . - , , . ?

? , . JavaScript. . , . ? .

тАж

! ?

Source: https://habr.com/ru/post/hi462483/


All Articles