സ്ട്രക്ചറൽ ഡിസൈൻ പാറ്റേണുകൾ: Facade, Flyweight, കൂടാതെ Proxy
ക്ലാസുകളെയും ഒബ്ജക്റ്റുകളെയും ക്രമീകരിക്കാൻ സ്ട്രക്ചറൽ ഡിസൈൻ പാറ്റേണുകൾ നിങ്ങളെ സഹായിക്കുന്നു.
നിങ്ങളുടെ ടൂൾകിറ്റ് പൂർത്തിയാക്കുന്നതിനായുള്ള അവസാന മൂന്ന് പാറ്റേണുകളെക്കുറിച്ചാണ് ഇന്ന് നമ്മൾ ചർച്ച ചെയ്യുന്നത്.
1. Facade പാറ്റേൺ സങ്കീർണ്ണമായ സിസ്റ്റങ്ങളെ Facade ലളിതമാക്കുന്നു. കുഴപ്പമേറിയ ഒരു കൂട്ടം ക്ലാസുകൾക്കായി ഇത് ഒരു ലളിതമായ ഇന്റർഫേസ് നൽകുന്നു.
ഒരു സിനിമ തിയേറ്ററിനെക്കുറിച്ച് ചിന്തിക്കുക. ഒരു സിനിമ കാണുന്നതിന്, നിങ്ങൾക്ക് ലൈറ്റുകൾ കുറയ്ക്കുകയും, പ്രൊജക്ടർ പ്രവർത്തിപ്പിക്കുകയും, കർട്ടനുകൾ തുറക്കുകയും ചെയ്യേണ്ടതുണ്ട്. അഞ്ച് വ്യത്യസ്ത സിസ്റ്റങ്ങളെ വിളിക്കുന്നതിന് പകരം, നിങ്ങൾ ഒരു മെത്തേഡ് മാത്രം വിളിക്കുന്നു: theater.watch_movie().
ഇത് ഉപയോഗിക്കേണ്ട സാഹചര്യങ്ങൾ:
- ഒരു സങ്കീർണ്ണമായ സബ്സിസ്റ്റത്തെ ലളിതമാക്കാൻ ആഗ്രഹിക്കുമ്പോൾ.
- ഒരു വലിയ API-ക്ക് ഒരു സിംഗിൾ എൻട്രി പോയിന്റ് ആവശ്യമായി വരുമ്പോൾ.
- ക്ലയന്റുകളെ ഇന്റേണൽ ലോജിക്കിൽ നിന്ന് വേർപെടുത്താൻ (decouple) ആഗ്രഹിക്കുമ്പോൾ.
2. Flyweight പാറ്റേൺ Flyweight മെമ്മറി ലാഭിക്കുന്നു. ആയിരക്കണക്കിന് സമാനമായ ഒബ്ജക്റ്റുകൾ ഉള്ളപ്പോൾ ഇത് ഉപയോഗപ്രദമാണ്.
ഓരോ ഒബ്ജക്റ്റിലും എല്ലാ വിവരങ്ങളും ശേഖരിക്കുന്നതിന് പകരം, നിങ്ങൾ ഡാറ്റയെ വിഭജിക്കുന്നു. പങ്കിടുന്നതും മാറാത്തതുമായ ഡാറ്റ (intrinsic state) ഒരിടത്ത് സൂക്ഷിക്കുന്നു. സവിശേഷമായ ഡാറ്റ (extrinsic state) വേറിട്ട് നിർത്തുന്നു.
ഇത് ഉപയോഗിക്കേണ്ട സാഹചര്യങ്ങൾ:
- മെമ്മറി ഉപയോഗം ഒരു വലിയ പ്രശ്നമാകുമ്പോൾ.
- ഒരു ടെക്സ്റ്റ് എഡിറ്ററിലെ ക്യാരക്ടറുകളോ ഒരു ഗെയിമിലെ പാർട്ടിക്കിൾസോ പോലെ ദശലക്ഷക്കണക്കിന് സമാനമായ ഒബ്ജക്റ്റുകൾ നിങ്ങൾ കൈകാര്യം ചെയ്യുമ്പോൾ.
- പെർഫോമൻസ് മെച്ചപ്പെടുത്താൻ ഒബ്ജക്റ്റ് പൂളിംഗ് (object pooling) ഉപയോഗിക്കാൻ ആഗ്രഹിക്കുമ്പോൾ.
3. Proxy പാറ്റേൺ മറ്റൊരു ഒബ്ജക്റ്റിന് പകരക്കാരനായി Proxy പ്രവർത്തിക്കുന്നു. ആക്സസ് നിയന്ത്രിക്കുന്നതിനായി ഇത് ക്ലയന്റും യഥാർത്ഥ ഒബ്ജക്റ്റും തമ്മിൽ ഇടയിൽ നിൽക്കുന്നു.
ഒരു പ്രോക്സിക്ക് ഇവ ചെയ്യാൻ കഴിയും:
- Lazy load: ഒരു ഉപയോക്താവ് ക്ലിക്ക് ചെയ്യുമ്പോൾ മാത്രം വലിയ ചിത്രങ്ങൾ ലോഡ് ചെയ്യുന്നു.
- ആക്സസ് നിയന്ത്രിക്കുക: ഒരു ഡാറ്റാബേസ് ഡിലീറ്റ് ചെയ്യാൻ ഉപയോക്താവിന് അനുമതിയുണ്ടോ എന്ന് പരിശോധിക്കുന്നു.
- ആക്റ്റിവിറ്റി ലോഗ് ചെയ്യുക: ഒരു പ്രത്യേക സേവനം ആര് ഉപയോഗിക്കുന്നു എന്ന് ട്രാക്ക് ചെയ്യുന്നു.
- റിസൾട്ടുകൾ കാഷെ (cache) ചെയ്യുക: കൂടുതൽ വിഭവങ്ങൾ എടുക്കുന്ന (expensive) ലോജിക് പ്രവർത്തിപ്പിക്കുന്നതിന് പകരം സേവ് ചെയ്ത ഡാറ്റ നൽകുന്നു.
ഇത് ഉപയോഗിക്കേണ്ട സാഹചര്യങ്ങൾ:
- കൂടുതൽ വിഭവങ്ങൾ എടുക്കുന്ന പ്രവർത്തനങ്ങൾ വൈകിപ്പിക്കേണ്ടതുണ്ടെങ്കിൽ.
- ഒരു സെൻസിറ്റീവ് സേവനം സംരക്ഷിക്കേണ്ടതുണ്ടെങ്കിൽ.
- ഒറിജിനൽ ക്ലാസ് മാറ്റാതെ തന്നെ ലോഗിംഗോ സെക്യൂരിറ്റിയോ ചേർക്കാൻ ആഗ്രഹിക്കുമ്പോൾ.
സംഗ്രഹം പട്ടിക (Summary Table)
• Adapter: പൊരുത്തപ്പെടാത്ത സിസ്റ്റങ്ങളെ ഒന്നിച്ച് പ്രവർത്തിപ്പിക്കുന്നു. • Bridge: അബ്സ്ട്രാക്ഷനെ ഇംപ്ലിമെന്റേഷനിൽ നിന്ന് വേർപെടുത്തുന്നു. • Composite: ട്രീ സ്ട്രക്ചറുകൾ നിർമ്മിക്കുന്നു. • Decorator: ക്ലാസുകളിൽ മാറ്റം വരുത്താതെ തന്നെ പുതിയ പെരുമാറ്റങ്ങൾ (behavior) ചേർക്കുന്നു. • Facade: സങ്കീർണ്ണമായ സബ്സിസ്റ്റങ്ങളെ ലളിതമാക്കുന്നു. • Flyweight: മെമ്മറി ലാഭിക്കാൻ ഡാറ്റ പങ്കിടുന്നു. • Proxy: ഒബ്ജക്റ്റുകളിലേക്കുള്ള ആക്സസ് നിയന്ത്രിക്കുന്നു.
ഗോൾഡൻ റൂൾ: കോഡ് മെയിന്റനബിൾ (maintainable) ആക്കാൻ ഈ പാറ്റേണുകൾ ഉപയോഗിക്കുക. വെറുതെ കാണിക്കാൻ വേണ്ടി മാത്രം ഇവ ഉപയോഗിക്കരുത്.
അടുത്തതായി, നമ്മൾ ബിഹേവിയറൽ ഡിസൈൻ പാറ്റേൺ (Behavioral Design Patterns) പരമ്പര ആരംഭിക്കുന്നു.