oop - বলত - আসক্ত ওরিয়েন্টেড প্রোগ্রামিং বনাম অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং




কোনটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা (4)

AOP একটি নতুন প্রোগ্রামিং দৃষ্টান্ত এই ধারণার সাথে ডিল করা হয়। একটি দৃষ্টিভঙ্গি একটি সফ্টওয়্যার সত্তা অ্যাপ্লিকেশনের একটি নির্দিষ্ট নন-ফাংশনাল অংশ বাস্তবায়ন।

আমি মনে করি এই নিবন্ধটি আসক্ত ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে শুরু করার জন্য একটি ভাল জায়গা: http://www.jaftalks.com/wp/index.php/introduction-to-aspect-oriented-programming/

এখানে এবং সারা বিশ্বের বেশিরভাগ ডেভেলপারদের মতো আমি অনেক বছর ধরে অবজেক্ট-ভিত্তিক প্রোগ্রামিং (OOP) কৌশলগুলি ব্যবহার করে সফটওয়্যার সিস্টেমগুলি বিকাশ করছি। তাই যখন আমি যে দৃষ্টিভঙ্গি-ভিত্তিক প্রোগ্রামিং (AOP) পড়তে পারি তখন অনেকগুলি সমস্যার সমাধান হয় যা ঐতিহ্যগত OOP সম্পূর্ণরূপে বা সরাসরি সমাধান করে না, আমি বিরতি এবং মনে করি, এটা কি সত্যি?

আমি এই AOP প্যারাডিজমের কীগুলি শিখতে অনেক তথ্য পড়েছি এবং একই জায়গায় আমি তাই করছি, তাই আমি বাস্তব বিশ্ব অ্যাপ্লিকেশন বিকাশে তার সুবিধাগুলি আরও ভালভাবে বুঝতে চেয়েছি।

কেউ উত্তর আছে?


OOP এবং AOP পারস্পরিক একচেটিয়া নয়। AOP OOP ভাল সংযোজন হতে পারে। AOP বিশেষভাবে স্ট্যান্ডার্ড কোড যেমন লগিং, পারফরম্যান্স ট্র্যাকিং ইত্যাদি যুক্ত করার জন্য কার্যকরী, এই মানক কোডটির সাথে পদ্ধতির কোডটি বন্ধ করে নাও।


কেন "বনাম"? এটা "বনাম" হয় না। আপনি কার্যকরী প্রোগ্রামিং সঙ্গে একত্রে অভিপ্রেত অভিভাবক প্রোগ্রামিং ব্যবহার করতে পারেন, কিন্তু অবজেক্ট ওরিয়েন্টেড এক সাথে সমন্বয়। এটি "বনাম" নয়, এটি "অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং সহ বস্তু ভিত্তিক প্রোগ্রামিং"।

আমার কাছে AOP কিছু "মেটা প্রোগ্রামিং"। AOP যা কিছু করে সেটি কেবলমাত্র আরো কোড যুক্ত করেই এটি করা যেতে পারে। AOP শুধু আপনি এই কোড লেখা সংরক্ষণ করে।

উইকিপিডিয়া এই মেটা প্রোগ্রামিংয়ের জন্য সেরা উদাহরণগুলির একটি। আপনি অনেক "সেট ... ()" পদ্ধতির সাথে একটি গ্রাফিকাল ক্লাস অনুমান করুন। প্রতিটি সেট পদ্ধতির পরে, গ্রাফিক্সের ডেটা পরিবর্তিত হয়, এইভাবে গ্রাফিক্স পরিবর্তিত হয় এবং এইভাবে গ্রাফিক্সটিকে স্ক্রীনে আপডেট করতে হবে। "Display.update ()" কল করতে গ্রাফিক্সটি পুনঃপুন করার জন্য অনুমান করুন। শাস্ত্রীয় পদ্ধতির আরও কোড যোগ করে এই সমাধান করা হয়। আপনি লিখুন প্রতিটি সেট পদ্ধতি শেষে

void set...(...) {
    :
    :
    Display.update();
}

আপনার যদি 3 সেট-পদ্ধতি থাকে তবে এটি কোন সমস্যা নয়। যদি আপনার 200 (কল্পনাপ্রসূত) আছে, এটি সর্বত্র এটি যোগ করার জন্য বাস্তব বেদনাদায়ক হচ্ছে। এছাড়াও যখনই আপনি একটি নতুন সেট-পদ্ধতি যোগ করেন, আপনাকে নিশ্চিত করতে হবে যে এটি শেষ পর্যন্ত যুক্ত করতে ভুলবেন না, অন্যথায় আপনি শুধু একটি বাগ তৈরি করেছেন।

AOP কোডটি টন না করেই সমাধান করে, পরিবর্তে আপনি একটি দৃষ্টিভঙ্গি যোগ করেন:

after() : set() {
   Display.update();
}

এবং এটাই! আপডেট কোডটি নিজের লেখার পরিবর্তে, আপনি কেবল সিস্টেমটিকে বলুন যে একটি সেট () বিন্দুটি শেষ হওয়ার পরে, এটি অবশ্যই এই কোডটি চালাতে হবে এবং এটি এই কোডটি চালাবে। 200 টি পদ্ধতি আপডেট করার দরকার নেই, এটি নিশ্চিত করার দরকার নেই যে আপনি এই কোডটি নতুন সেট-পদ্ধতিতে যোগ করতে ভুলবেন না। উপরন্তু আপনি শুধু একটি বিন্দু প্রয়োজন:

pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);

ওটার মানে কি? এর অর্থ হল কোন পদ্ধতিটি "সেট *" (* মানে যে কোনও নাম সেট করার পরে অনুসরণ করতে পারে), কোনও পদ্ধতিটি ফেরত দেয় (প্রথম তারকাবিজ্ঞান) বা এটি কোন প্যারামিটার নেয় (তৃতীয় তারকাবিশেষ) এবং এটি MyGraphicsClass এর একটি পদ্ধতি এবং এটির ক্লাসটি "com.company। *" প্যাকেজের অংশ, তারপর এটি একটি সেট () বিন্দু। এবং আমাদের প্রথম কোডটি "কোনও নির্দিষ্ট বিন্দুতে যে কোন পদ্ধতি চালানোর পরে, নিম্নলিখিত কোডটি চালান" বলে।

AOP সুন্দরভাবে এখানে সমস্যা সমাধান কিভাবে দেখুন? আসলে বর্ণিত সবকিছু এখানে কম্পাইল সময় সম্পন্ন করা যেতে পারে। একটি AOP প্রিপোপ্রসেসর কেবল আপনার উত্সটি সংশোধন করতে পারে (যেমন প্রতিটি সেট-পয়েন্টক পদ্ধতির শেষে প্রদর্শন.উপডেট () যোগ করে) ক্লাসটি নিজেও সংকলন করার আগে।

যাইহোক, এই উদাহরণ AOP এর বড় downsides এক দেখায়। AOP আসলে এমন কিছু করছে যা অনেক প্রোগ্রামাররা " Anti-Pattern " বিবেচনা করে। সঠিক প্যাটার্ন " একটি দূরত্ব এ কর্ম " বলা হয়।

দূরত্বে কর্মটি একটি অ্যান্টি-প্যাটার্ন (একটি স্বীকৃত সাধারণ ত্রুটি) যা প্রোগ্রামের একটি অংশে আচরণের প্রোগ্রামের অন্য অংশে ক্রিয়াকলাপ সনাক্ত করতে কঠিন বা অসম্ভবের উপর ভিত্তি করে বন্যভাবে পরিবর্তিত হয়।

একটি প্রকল্পে একটি নবীন হিসাবে, আমি কোন সেট-পদ্ধতির কোডটি পড়তে পারি এবং এটি ভাঙ্গা বিবেচনা করতে পারে, কারণ এটি প্রদর্শনটি আপডেট করা মনে হচ্ছে না। আমি কেবল একটি সেট-পদ্ধতির কোডটি দেখেই দেখতে পাই না, এটি কার্যকর হওয়ার পরে, অন্য কোনও কোডটি "আপডেট করার জন্য" যাদুকরীভাবে কার্যকর হবে। আমি এই একটি গুরুতর নেতিবাচক বিবেচনা! একটি পদ্ধতিতে পরিবর্তন করে, অদ্ভুত বাগগুলি চালু করা যেতে পারে। আরও কোড কোড প্রবাহ বোঝা যেখানে কিছু জিনিস সঠিকভাবে কাজ বলে মনে হচ্ছে, কিন্তু স্পষ্ট নয় (যেমন আমি বলেছি, তারা কেবল যাদুকরভাবে কাজ করে ... কোনওভাবে), এটি সত্যিই কঠিন।

হালনাগাদ

শুধু এটা স্পষ্ট করার জন্য: কিছু লোকের ধারণা থাকতে পারে যে আমি বলেছি AOP কিছু খারাপ এবং ব্যবহার করা উচিত নয়। যে আমি কি বলছি না! AOP আসলে একটি মহান বৈশিষ্ট্য। আমি শুধু "এটি সাবধানে ব্যবহার করুন" বলুন। AOP শুধুমাত্র একই সমস্যার জন্য সাধারণ কোড এবং AOP মিশ্রিত করলেই সমস্যাগুলি সৃষ্টি করবে। উপরের উদাহরণে, আমাদের গ্রাফিক্যাল অবজেক্টের মানগুলি আপডেট করার এবং আপডেট হওয়া বস্তুর চিত্রিত করার দৃষ্টিভঙ্গি রয়েছে। যে আসলে একটি একক দৃষ্টিভঙ্গি। স্বাভাবিক কোড হিসাবে এটি অর্ধেক কোডিং এবং এটি অর্ধেক হিসাবে এটি দৃষ্টিভঙ্গি সমস্যা যোগ করে।

যদি আপনি সম্পূর্ণ ভিন্ন দৃষ্টিভঙ্গির জন্য AOP ব্যবহার করেন, যেমন লগিংয়ের জন্য, আপনি এন্টি-প্যাটার্ন সমস্যাটি চালাতে পারবেন না। সেই ক্ষেত্রে প্রকল্পটির নবীনতা হয়তো ভাবতে পারে "এই সমস্ত লগ বার্তাগুলি কোথা থেকে এসেছে? আমি কোডে কোনও লগ আউটপুট দেখতে পাচ্ছি না", কিন্তু এটি একটি বিশাল সমস্যা নয়। প্রোগ্রাম লজিকের পরিবর্তনগুলি সেগুলি লগ সুবিধাটি কমবে না এবং লগ সুবিধাতে করা পরিবর্তনগুলি তার প্রোগ্রাম লজিককে খুব কমই ভাঙ্গবে - এই দিকগুলি পুরোপুরি আলাদা। লগিংয়ের জন্য AOP ব্যবহার করার সুবিধাটি আপনার প্রোগ্রাম কোডটি যা করতে হবে তার উপর সম্পূর্ণ মনোযোগ দিতে পারে এবং আপনার কোডটি সর্বত্র শত শত লগ বার্তা দ্বারা বিভক্ত না হয়েও আপনি অত্যাধুনিক লগিং করতে পারেন। এছাড়াও যখন নতুন কোড চালু করা হয়, তখন যাদুকর লগ বার্তাগুলি সঠিক সামগ্রীতে সঠিক সময়ে প্রদর্শিত হবে। নবাগত প্রোগ্রামার বুঝতে পারছেন না কেন তারা এসেছে বা তারা কোথা থেকে এসেছে, কিন্তু যেহেতু তারা "সঠিক সময়" এ "সঠিক জিনিস" লগ ইন করবে, সে কেবল আনন্দের সাথেই তারা স্বীকার করতে পারে যে তারা সেখানে রয়েছে এবং অন্য কিছুতে চলে যাচ্ছে। ।

সুতরাং আমার উদাহরণে AOP এর একটি ভাল ব্যবহার সবসময় একটি সেট পদ্ধতির মাধ্যমে আপডেট করা হলে লগ করতে হবে। এটি একটি অ্যান্টি-প্যাটার্ন তৈরি করবে না এবং কখনও কখনও কোনও সমস্যার কারণ হতে পারে না।

কেউ বলতে পারে, যদি আপনি খুব সহজেই এপিকে অনেকগুলি সমস্যা তৈরি করতে ব্যবহার করতে পারেন তবে এটি সমস্ত ব্যবহার করার জন্য একটি খারাপ ধারণা। তবে কোন প্রযুক্তি ব্যবহার করা যাবে না? আপনি তথ্য encapsulation অপব্যবহার করতে পারেন, আপনি উত্তরাধিকার অপব্যবহার করতে পারেন। বেশ অনেক দরকারী প্রোগ্রামিং প্রযুক্তি অপব্যবহার করা যেতে পারে। একটি প্রোগ্রামিং ভাষা বিবেচনা করুন যাতে সীমিত যে এটি শুধুমাত্র এমন বৈশিষ্ট্য রয়েছে যা অপব্যবহার করা যায় না; এমন একটি ভাষা যেখানে বৈশিষ্ট্যগুলি কেবলমাত্র ব্যবহার করা যেতে পারে এমনভাবেই ব্যবহার করা যেতে পারে। এমন ভাষা এমন সীমিত হবে যে এটি যদি সত্যিকারের বিশ্ব প্রোগ্রামিংয়ের জন্যও ব্যবহার করা যেতে পারে তবে এটি যুক্তিযুক্ত।


দৃষ্টিভঙ্গি ভিত্তিক pogramming লগিং, নিরাপত্তা মত ক্রস কাটিয়া উদ্বেগ বাস্তবায়ন করার জন্য একটি চমৎকার উপায় প্রদান করে। এই ক্রস কাটিয়া কনসার্ট যুক্তিযুক্ত টুকরা যা অনেক জায়গায় প্রয়োগ করতে হবে তবে আসলে ব্যবসায়িক লজিকের সাথে কিছু করার নেই।

আপনি OOP এর প্রতিস্থাপন হিসাবে AOP- কে একটি চমৎকার অ্যাড-অন হিসাবে দেখেন না, যা আপনার কোডটিকে আরও পরিষ্কার করে তোলে, স্বল্পভাবে সংযুক্ত করে এবং ব্যবসায়িক লজিকের উপর দৃষ্টি নিবদ্ধ করে। তাই AOP প্রয়োগ করে আপনি gt 2 টি প্রধান সুবিধা পাবেন:

  1. প্রতিটি উদ্বেগের জন্য যুক্তি এখন এক জায়গায়, কোড কোড জুড়ে ছড়িয়ে ছিটিয়ে থাকা হিসাবে বিরোধিতা করা হয়।

  2. ক্লাস ক্লিনার হয় কারণ এটি শুধুমাত্র তাদের প্রাথমিক উদ্বেগ (বা মূল কার্যকারিতা) জন্য কোড ধারণ করে এবং সেকেন্ডারি উদ্বেগ দিকগুলিতে সরানো হয়েছে।





paradigms