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


199

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

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

কারও কি উত্তর আছে?


7
সমস্ত উত্তর খুব ভাল হয়েছে, এটি একটি একক সম্প্রদায়ের সম্পাদিত উত্তরের জন্য একটি নিখুঁত মামলা যা তাদের সমস্তকে একত্রিত করে। সকলেই একই কথা বলছেন তবে বিভিন্ন উপায়ে এবং বিভিন্ন উদাহরণ ব্যবহার করে যা সামগ্রিক মানকে যুক্ত করে
ভিঙ্কো ভার্সালোভিক

উত্তর:


323

"বনাম" কেন? এটি "বনাম" নয়। আপনি ফাংশনাল প্রোগ্রামিংয়ের সাথে মিলিয়ে অ্যাসপেক্ট ওরিয়েন্টেড প্রোগ্রামিং ব্যবহার করতে পারেন, তবে অবজেক্ট ওরিয়েন্টডের সাথে সংমিশ্রণে। এটি "বনাম" নয়, এটি "অ্যাসপেক্ট ওরিয়েন্টেড প্রোগ্রামিং উইথ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং"।

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

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

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

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

AOP টন কোড যোগ না করে এটি সমাধান করে, পরিবর্তে আপনি কোনও দিক যোগ করুন:

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

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

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

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

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

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

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

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

হালনাগাদ

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

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

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

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


4
লগিং এমন একটি নির্দিষ্ট উদাহরণ বলে মনে হয় যেখানে এওপির কোনও দূরত্বের অ্যাকশনে ফলাফল হয় না। এই মুহুর্তে, উইকিপিডিয়া সুরক্ষা চেকগুলির মতো বিষয়ের জন্য দিকটি ব্যবহারের উদাহরণ হিসাবে, যা প্রোগ্রামটিকে আরও বেশি বোঝার জন্য প্রবাহিত করে।
kizzx2

7
@ কিজএক্সএক্স 2: লগিংয়ের দুর্দান্ত বিষয়, বাস্তবে - এটি এওপি সম্পর্কে বেশি কিছু না জেনে আমি এওপি-র শক্তি দেখেছি এটি সেরা উদাহরণ example ভাগ করে নেওয়ার জন্য ধন্যবাদ!
30:30

@ মেক্কি, আপনার উদাহরণ অত্যধিক সরল করা হয়েছে এবং সাধারণ ব্যবহারের ক্ষেত্রে প্রতিফলিত হয় না। আপনার উদাহরণে, Display.updateকোনও যুক্তি গ্রহণ করবেন না। আমাদের যদি যুক্তিগুলি পাস করার প্রয়োজন হয় (উদাহরণস্বরূপ সাধারণত কোনও logফাংশনটির জন্য messageপ্যারামিটারের প্রয়োজন হয় )? আমাদের কি তখন এওপি পদ্ধতিতে বয়লারপ্লেট কোড যুক্ত করার দরকার হবে না?
পেসারিয়ার

3
@ পেসারিয়ার আমার উদাহরণটি সরল করা হয়েছে কারণ এসও কোনও পাঠদান ফোরাম নয়। আমি কেবল প্রশ্নকারীর প্রশ্নের উত্তর দিচ্ছিলাম, সম্ভবত প্রয়োজনের চেয়ে আরও বিশদ বিবরণ। আপনি যদি এওপি সম্পর্কে আরও জানতে চান তবে কিছু প্রোগ্রামার ডকুমেন্টেশন পড়ার চেষ্টা করুন এবং আপনার যদি একটি বিশদ প্রশ্ন থাকে তবে কেন এটি এখানে জিজ্ঞাসা করছেন না? না, একটি মন্তব্যে নেই, যান এবং কারণ একটি নতুন প্রশ্ন তৈরি করে কি তাই সব সম্পর্কে হয়। আমি নিশ্চিত যে উত্তরে কেউ আপনার সন্দেহগুলি দূর করতে সক্ষম হবে।
মেকি

2
@ পেসারিয়ার দুঃখিত, তবে আমি আপনার বক্তব্যটি দেখতে ব্যর্থ। এখানে দেখুন: stackoverflow.com/a/8843713/15809 এই কোডটি সমস্ত পদ্ধতির যুক্তির ধরণ এবং মানগুলি সহ প্রতিটি পাবলিক পদ্ধতিতে প্রতিটি কল লগ করে। আপনি ঠিক এটি লিখে ফেলুন এবং কোনও পদ্ধতিতে শূন্য বয়লারপ্লেট কোড যুক্ত রয়েছে, এটি কেবলমাত্র উত্তরে প্রদর্শিত কোড।
মক্কি

29

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

আপনাকে ওওপি-র প্রতিস্থাপন হিসাবে আরও বেশি সুন্দর অ্যাড-অন হিসাবে দেখা উচিত নয়, যা আপনার কোডটিকে আরও পরিচ্ছন্ন, আলগাভাবে মিলিত এবং ব্যবসায়িক যুক্তিতে ফোকাস করে। সুতরাং এওপি প্রয়োগ করে আপনি 2 টি বড় সুবিধা পাবেন:

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

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


27

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


10

আমি মনে করি এই প্রশ্নের কোনও সাধারণ উত্তর নেই তবে একটি বিষয় লক্ষণীয়, এওপি ওওপি প্রতিস্থাপন করে না তবে প্রভাবশালী রচনা ( 1 ) (বা ক্রসকাট উদ্বেগ) এর তথাকথিত অত্যাচারকে সম্বোধন করে এমন কিছু পচন বৈশিষ্ট্য যুক্ত করে ।

এটি কোনও নির্দিষ্ট প্রকল্পের জন্য আপনি যতক্ষণ পর্যন্ত সরঞ্জাম এবং ভাষা নিয়ন্ত্রণে ব্যবহার করতে পারেন ততক্ষণে এটি নির্দিষ্ট ক্ষেত্রে সহায়তা করে তবে এজেডিটি-র মতো অতিরিক্ত সরঞ্জামগুলির প্রয়োজনীয়তা এবং পারস্পরিক ইন্টারঅ্যাকশন সম্পর্কিত জটিলতার একটি নতুন মাত্রা যুক্ত করেছে আপনার প্রোগ্রাম

গ্রেগর কিকজালেস একবার গুগল টেক টকসে এওপিতে একটি আকর্ষণীয় সূচনা বক্তৃতা দিয়েছিলেন যা আমি দেখার পরামর্শ দিই: দিক থেকে ওরিয়েন্টেড প্রোগ্রামিং: মডুলারিটিতে র‌্যাডিকাল রিসার্চ


8

সবার আগে এওপি ওওপি প্রতিস্থাপন করবে না। এওপি ওওপি প্রসারিত করে। ওওপির ধারণা এবং অনুশীলনগুলি প্রাসঙ্গিক থাকে। একটি ভাল অবজেক্ট ডিজাইন থাকার কারণে এটি দিকগুলির সাথে এটি প্রসারিত করা সহজতর হবে।

আমি মনে করি এওপি যে ধারণা নিয়ে আসে তা গুরুত্বপূর্ণ। আপনার প্রোগ্রামগুলিতে নিজেরাই ক্লাস পরিবর্তন না করেই আপনার প্রোগ্রামে বিভিন্ন শ্রেণীর উপর ক্রস-কাটিং-উদ্বেগগুলি কার্যকর করার উপায়গুলি আমাদের বের করা উচিত। তবে আমি মনে করি এওপি শেষ পর্যন্ত কেবলমাত্র আমরা ব্যবহার করা অন্যান্য সরঞ্জামগুলির অংশ হয়ে উঠবে, কোনও আলাদা সরঞ্জাম বা কৌশল নয়। আমরা ইতিমধ্যে এটি ঘটতে দেখছি।

রুবি এবং পাইথনের মতো বেশ কয়েকটি গতিময় ভাষার মিক্সিনগুলির মতো ভাষা গঠন রয়েছে যা একই সমস্যাগুলি সমাধান করে। এটি দেখতে অনেকটা এওপির মতো তবে ভাষায় আরও ভালভাবে সংহত করা হয়েছে।

স্প্রিং এবং ক্যাসেল এবং অন্যান্য কয়েকটি নির্ভরতা ইনজেকশন কাঠামোতে তারা ইনজেক্ট করা ক্লাসগুলিতে আচরণ যুক্ত করার বিকল্প রয়েছে। এটি রানটাইম-বুনন করার একটি উপায় এবং আমি মনে করি এটির প্রচুর সম্ভাবনা রয়েছে।

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


1

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

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


1

আমি এই প্রশ্নটি স্থগিত করতে দেরি করছি তবে এটি আমার প্রিয় একটি বিষয় তাই আমাকে আমার মতামত জানাতে দিন।

ওওপি সাধারণত আপনার ব্যবসায়িক যুক্তি সংগঠিত করতে ব্যবহৃত হয় যখন এওপি আপনার অ-কার্যকরী জিনিসগুলি যেমন অডিটিং, লগিং, লেনদেন পরিচালনা, সুরক্ষা ইত্যাদি সংগঠিত করতে সহায়তা করে

এইভাবে আপনি আপনার ব্যবসায়িক যুক্তিকে অ-কাল্পনিক যুক্তি দিয়ে ডিকুয়াল করতে পারেন যা কোড ক্লিনার করে।

ওটার সুবিধা হ'ল আপনি পরামর্শ (উদাহরণস্বরূপ নিরীক্ষণ) প্রয়োগ করতে পারবেন কোনও ইন্টারফেস প্রয়োগ না করে যা ব্যবসায়ের যুক্তি স্পর্শ না করে পরিবর্তনের জন্য দুর্দান্ত নমনীয়তা দেয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.