কিছু সমস্যাগুলি কি এওপি দিয়ে আরও মার্জিতভাবে সমাধান করা হয়?


19

আমি অ্যাস্পেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের ধারণাটি নিয়ে এসেছি এবং এর সাথে আমার কিছু উদ্বেগ রয়েছে।

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

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

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

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


আহ, বিখ্যাত বানর প্যাচ!
Muad'Dib

1
আমি প্রশ্নটির সুরটি উন্নত করতে সম্পাদনা করেছি এবং আবার খুলতে ভোট দিয়েছি।
রবার্ট হার্ভে

কুইস্টিয়োকেও এখানে অন্য রূপে পুনরায় জিজ্ঞাসা করা হয়েছে: প্রোগ্রামার্স.সটাকেক্সচেঞ্জ
পিটার বুফটন

উত্তর:


19

অ্যাস্পেক্ট-ওরিয়েন্টেড প্রোগ্রামিং আপনার নির্দিষ্ট অ্যাপ্লিকেশন বা লাইব্রেরি জুড়ে অকারণে স্ক্র্যাড কোড ছাড়াই করা শক্ত এমন কিছু প্রোগ্রামিং করা সম্ভব করে তোলে যা আপনার সফ্টওয়্যারটির প্রাথমিক কার্যাদি সম্পর্কিত নয় (যেমন ক্রস কাটিং উদ্বেগ)। উদাহরণ অন্তর্ভুক্ত:

  1. লগিং এবং পর্যবেক্ষণ
  2. কর্মক্ষমতা বিশ্লেষণ
  3. ডিবাগিং এবং ট্র্যাকিং
  4. কার্যকারিতা পূর্বাবস্থায় ফেরান
  5. ইনপুট এবং আউটপুটগুলির বৈধতা
  6. বিদ্যমান অবজেক্টের আচরণকে রূপ দেওয়া
  7. অবজেক্ট ফিল্টার
  8. সুরক্ষা বাস্তবায়ন
  9. লেনদেন পরিচালনা

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

এখানে মূল বক্তব্যটি হ'ল এওপি অ্যাপ্লিকেশন জুড়ে 1) সাধারণ এবং 2) অ্যাপ্লিকেশনটির প্রাথমিক কার্যকারিতাটির জন্য পেরিফেরিয়াল আচরণকে আবদ্ধ করে।


7

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

আপনার অ্যাপ্লিকেশন যদি এটি সঠিকভাবে পরিচালনার জন্য নির্ভর করে তবে আমি এওপির বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দেব would দিকগুলি এর মতো কাজ করে:

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

যে কেউ দীর্ঘকাল ধরে কম্পিউটার করছে, তার জন্য যে নিদর্শনগুলি ব্যবহৃত হয় তা নিবিড়ভাবে দেখার জন্য হতে পারে। সুতরাং এখানে পয়েন্টকাটের একটি উদাহরণ setযা যুক্তি নির্বিশেষে নামের যে কোনও পদ্ধতির সাথে মেলে :

call(* set(..))

সুতরাং এটি মোটামুটি ঝাপটানো পয়েন্টকুট এবং এটি পরিষ্কার হওয়া উচিত যে যত্ন সহকারে এটি পরিচালনা করার পরামর্শ দেওয়া হয় (কোনও পাং উদ্দেশ্য নয়) কারণ আপনি অনেকগুলি বিষয়ে পরামর্শ প্রয়োগ করছেন।

বা হ্যাক, আসুন নাম বা স্বাক্ষর নির্বিশেষে সমস্ত কিছুতে পরামর্শ প্রয়োগ করুন !

execution(* *(..))

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

তুলনামূলকভাবে নিরাপদ পয়েন্টকাটের মতো দেখতে এখানে দেখুন:

pointcut setter(): target(Point) &&
                   ( call(void setX(int)) ||
                     call(void setY(int)) );

নাম setXবা setYকোনও Pointবস্তুর নাম পাওয়া যায় এমন পদ্ধতিগুলি স্পষ্টভাবে পরামর্শ দেয় । পদ্ধতিগুলি কেবলমাত্র গ্রহণ করতে পারে intএবং সেগুলি অবশ্যই হবে void। দেখতে বেশ নিরাপদ, তাই না? ঠিক আছে, যদি সেই পদ্ধতিগুলি বিদ্যমান থাকে এবং আপনি সঠিক পরামর্শটি প্রয়োগ করেন তবে এটি নিরাপদ। যদি না হয়, খুব খারাপ; এটি নিঃশব্দে ব্যর্থ হয়।

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

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

সুতরাং, লগিং, ডিবাগিং এবং ট্রেসিং এমন আচরণগুলির দুর্দান্ত উদাহরণ যা দিকগুলির জন্য উপযুক্ত, তবে সুরক্ষা? নাঃ। থ্রেড সুরক্ষা? নাঃ।

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


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

2

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

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

এবং যদি আপনি যাইহোক কোনও লগিংয়ের দিকটি তৈরি করে থাকেন তবে আপনি এওপি-র মাধ্যমে লগিংটি নিজের কোডটিও কার্যকর করতে পারেন implementing


লগিং "আকর্ষণীয়" জিনিসগুলির জন্য। "এই পরামিতিগুলির সাথে প্রবেশ করা" এবং এওপি লগিংয়ের সাথে "প্রস্থান করা" ছাড়া আপনি অন্যান্য জিনিস কীভাবে করতে পারেন?

@ থরবজর্ন: লগিং / ডিবাগিং / ট্রেসিং কার্যকারিতার অনেকগুলি ক্ষেত্রের মধ্যে একটি মাত্র এওপি সহায়তা করতে পারে। আমি আমার দৃষ্টান্তটি উদাহরণ হিসাবে উদাহরণ হিসাবে ব্যবহার করেছি। আমি যে বিষয়টিটি তৈরির চেষ্টা করছি সেটি হ'ল এওপি আপনাকে তৃতীয় পক্ষের বাইটকোডের উপর আরও নিয়ন্ত্রণ দেয়।
জোসেফ তেনেনবাউম

অবশ্যই, তবে আমি সত্যিই জানতে চেয়েছিলাম যে এওপি লগিং কেবল প্রবেশ-প্রস্থান লগিংয়ের চেয়ে আরও বেশি কিছু করতে পারে?

এটি আপনি যে এওপি সরঞ্জামটি ব্যবহার করেন তার উপর নির্ভর করে তবে আপনি যা করতে পারেন তার অবশ্যই সীমাবদ্ধতা রয়েছে। প্রবেশ-প্রস্থান লগিংয়ের বাইরে যাওয়া খুব ভালই হতে পারে।
জোসেফ তেনেনবাউম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.