ΠŸΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€

🌍 ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΌΠΈΡ€!

🌍 ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΌΠΈΡ€!

БСгодня Ρ‚Π΅ΠΌΠ° ΠΈΠ· разряда ΠΊΠ°ΠΊ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ свой ΠΊΠΎΠ΄, ΠΏΡƒΡ‚Π΅ΠΌ примСнСния Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ². БСгодня ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ Proxy Pattern.

πŸš€ ΠœΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΡ

Один ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² проСктирования β€” Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отвСтствСнности. Proxy позволяСт Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ основному ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Π΅Π· Π΅Π³ΠΎ измСнСния.

⁉️ Π“Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ proxy?

1️⃣ Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².
2️⃣ ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² вычислСний для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
3️⃣ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° доступа: ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΈ Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π° основС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… условий.

πŸ“Ž ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ proxy

1️⃣ Axios β€” ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊ для измСнСния запросов ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ².
2️⃣ Redux β€” Middleware для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ дСйствий, отправляСмых Π² стор.
3️⃣ JavaScript (ES6) β€” ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Proxy для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈ пСрСопрСдСлСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.
4️⃣ Vue.js β€” Π Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ связываниС Π΄Π°Π½Π½Ρ‹Ρ… с использованиСм прокси (Π² Vue 3) для отслСТивания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ обновлСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

πŸ” Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ proxy pattern?

Proxy Pattern β€” структурный ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт доступом ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² связкС с Observer Pattern (ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‚Π°Ρ€Π³Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) ΠΈ Decorator Pattern (Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ добавляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ).

πŸ“ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ proxy:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ прокси для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

interface ProductService {
  getProductDetails(id: string): string;
}

class ProductDatabase implements ProductService {
  public getProductDetails(id: string): string {
    console.log(`ProductDatabase: Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ ${id}.`);
    // Бимуляция Π²Ρ‹Π·ΠΎΠ²Π° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
    return `Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅: ${id}`;
  }
}

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ (класс) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится core business logic.

class ProductProxy implements ProductService {
  private productDatabase: ProductDatabase;
  private cache: { [key: string]: string } = {};

  constructor(productDatabase: ProductDatabase) {
    this.productDatabase = productDatabase;
  }

  public getProductDetails(id: string): string {
    if (this.cache[id]) {
      console.log(`Proxy: Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ${id} ΠΈΠ· кэша.`);
      return this.cache[id];
    }

    console.log(`Proxy: ΠŸΡƒΡΡ‚ΠΎ, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….`);
    const details = this.productDatabase.getProductDetails(id);
    this.cache[id] = details;
    return details;
  }
}

ΠŸΡ€ΠΎΠΊΡΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² случаС Ссли ΠΈΡ… Ρ‚Π°ΠΌ Π½Π΅ Π±Ρ‹Π»ΠΎ, ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΈΠ· cache.

// РСализация
function clientCode(productService: ProductService, id: string) {
  console.log(productService.getProductDetails(id));
}


// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±Π΅Π· прокси
const productDatabase = new ProductDatabase();
clientCode(productDatabase, 'ΠΌΠΎΠ»ΠΎΠΊΠΎ');

 // Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
ProductDatabase: Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ ΠΌΠΎΠ»ΠΎΠΊΠΎ.
Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅: ΠΌΠΎΠ»ΠΎΠΊΠΎ


// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с прокси
const productProxy = new ProductProxy(productDatabase);

clientCode(productProxy, 'ΠΊΠ΅Ρ„ΠΈΡ€'); // ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²
clientCode(productProxy, 'ΠΊΠ΅Ρ„ΠΈΡ€'); // Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ²

// Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
// ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²
Proxy: ΠŸΡƒΡΡ‚ΠΎ, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….
ProductDatabase: Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ ΠΊΠ΅Ρ„ΠΈΡ€.
Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅: ΠΊΠ΅Ρ„ΠΈΡ€

// Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ²
Proxy: Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΊΠ΅Ρ„ΠΈΡ€ ΠΈΠ· кэша.
Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅: ΠΊΠ΅Ρ„ΠΈΡ€


ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ взаимодСйствиС с интСрфСйсом ProductService, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ прямым ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ProductDatabase, Ρ‚Π°ΠΊ ΠΈ Ρ‡Π΅Ρ€Π΅Π· ProductProxy. ΠŸΡ€ΠΈ использовании прокси ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ запросы Π½Π° Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π΅ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠ· кэша.

‼️
Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

πŸ’‘ Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ прокси ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·-Π·Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ уровня абстракции.
πŸ’‘ НС злоупотрСбляйтС прокси для Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простыми способами.
πŸ’‘ ИспользованиС Proxy ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ Π΄Π΅Π±Π°Π³ ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, особСнно Ссли прокси ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ прокси.

πŸ’¬ Π”Π΅Π»ΠΈΡ‚Π΅ΡΡŒ своим ΠΌΠ½Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡΡ…πŸ‘‡! Если Π²Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ ΡΡ‚Π°Ρ‚ΡŒΡ, Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»Π°ΠΉΠΊ! πŸ‘

#PATTERNS
МСдиа 1
Π₯ΠΎΡ‚ΠΈΡ‚Π΅ большС Ρ‚Π°ΠΊΠΈΡ… постов?
ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ΡΡŒ Π½Π° ΠΊΠ°Π½Π°Π» ΠΈ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π² Telegram.
ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° @ivanchikovitclub ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ пост Π² Telegram