"চারপাশে চালানো" প্রবাদটি কী?


151

এই "প্রায়শই চালিত করুন" আইডিয়োম (বা অনুরূপ) আমি কী শুনেছি? আমি কেন এটি ব্যবহার করতে পারি এবং কেন আমি এটি ব্যবহার করতে চাই না?


9
আমি খেয়াল করিনি এটি আপনিই ছিলেন ack অন্যথায় আমি আমার উত্তরে আরও কৌতুকপূর্ণ হতে পারি;)
জন স্কিটি

1
সুতরাং এটি মূলত একটি দিক ঠিক? যদি তা না হয় তবে কীভাবে এটির পার্থক্য রয়েছে?
লুকাস

উত্তর:


147

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

public interface InputStreamAction
{
    void useStream(InputStream stream) throws IOException;
}

// Somewhere else    

public void executeWithFile(String filename, InputStreamAction action)
    throws IOException
{
    InputStream stream = new FileInputStream(filename);
    try {
        action.useStream(stream);
    } finally {
        stream.close();
    }
}

// Calling it
executeWithFile("filename.txt", new InputStreamAction()
{
    public void useStream(InputStream stream) throws IOException
    {
        // Code to use the stream goes here
    }
});

// Calling it with Java 8 Lambda Expression:
executeWithFile("filename.txt", s -> System.out.println(s.read()));

// Or with Java 8 Method reference:
executeWithFile("filename.txt", ClassName::methodName);

কলিং কোডটি ওপেন / ক্লিন-আপ সাইড সম্পর্কে চিন্তা করার দরকার নেই - এটি যত্ন নেওয়া হবে executeWithFile

জাভাতে এটি স্পষ্টভাবে বেদনাদায়ক ছিল কারণ সমাপনিগুলি এত কথামূলক ছিল, জাভা 8 দিয়ে লাম্বদা এক্সপ্রেশনটি শুরু করে অন্যান্য অনেক ভাষায় প্রয়োগ করা যেতে পারে (যেমন সি # ল্যাম্বদা এক্সপ্রেশন বা গ্রোভি), এবং জাভা 7 সহ try-with-resourcesএবং AutoClosableস্ট্রিমের পরে এই বিশেষ কেসটি পরিচালনা করা হয়।

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


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

3
সুতরাং এটি সি এর মতো যেখানে আপনার কোনও ফাংশন রয়েছে যা আপনি কোনও কাজ করার জন্য কোনও ফাংশন পয়েন্টারে পাস করেন?
পল টমবলিন 21

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

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

4
জাভা 7 টি যুক্ত-সংস্থান-সহ, এবং জাভা 8 যুক্ত ল্যাম্বডাস যুক্ত করেছে। আমি জানি এটি একটি পুরানো প্রশ্ন / উত্তর তবে আমি সাড়ে পাঁচ বছর পরে এই প্রশ্নের দিকে যে কেউ তাকিয়ে আছে তার জন্য আমি এটি নির্দেশ করতে চেয়েছিলাম। এই উভয় ভাষার সরঞ্জামই সমাধান করতে সহায়তা করবে এই প্যাটার্নটি সমাধানের জন্য was

45

আপনি যখন নিজেকে এই জাতীয় কিছু করতে দেখেন তখন এক্সিকিউট আউটড আইডিয়াম ব্যবহার করা হয়:

//... chunk of init/preparation code ...
task A
//... chunk of cleanup/finishing code ...

//... chunk of identical init/preparation code ...
task B
//... chunk of identical cleanup/finishing code ...

//... chunk of identical init/preparation code ...
task C
//... chunk of identical cleanup/finishing code ...

//... and so on.

আপনার আসল কাজগুলিকে "আশেপাশে" সর্বদা কার্যকর করা হয় এমন সমস্ত অপ্রয়োজনীয় কোডটির পুনরাবৃত্তি এড়াতে আপনি স্বয়ংক্রিয়ভাবে যত্ন নিয়ে এমন একটি শ্রেণী তৈরি করবেন:

//pseudo-code:
class DoTask()
{
    do(task T)
    {
        // .. chunk of prep code
        // execute task T
        // .. chunk of cleanup code
    }
};

DoTask.do(task A)
DoTask.do(task B)
DoTask.do(task C)

এই আইডিয়মটি জটিল সমস্ত রিন্ডান্ট্যান্ট কোডকে এক জায়গায় নিয়ে যায় এবং আপনার মূল প্রোগ্রামটি আরও বেশি পঠনযোগ্য (এবং রক্ষণাবেক্ষণযোগ্য!) রেখে দেয়

সি # উদাহরণের জন্য এই পোস্টটি দেখুন এবং এই নিবন্ধটি একটি সি ++ উদাহরণের জন্য দেখুন।


7

একটি এক্সিকিউট আউট মেথড হ'ল যেখানে আপনি একটি পদ্ধতিতে স্বেচ্ছাচারিত কোডটি পাস করেন যা সেটআপ এবং / অথবা টিয়ারডাউন কোড সম্পাদন করতে পারে এবং এর মধ্যে আপনার কোডটি কার্যকর করতে পারে।

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

আমার কাছে মনে হয় যে প্রায়শই এক্সিকিউট করা পদ্ধতিটি ইনভার্শন অফ কন্ট্রোলের (ডিপেন্ডেন্সি ইনজেকশন) এর মতো, আপনি যখনই পদ্ধতিটি কল করবেন তখনই আপনি এইড-হকের পরিবর্তিত হতে পারেন।

তবে এটিকে কন্ট্রোল কাপলিংয়ের উদাহরণ হিসাবে ব্যাখ্যাও করা যেতে পারে (আক্ষরিক ক্ষেত্রে এই পদ্ধতিতে তার যুক্তি দিয়ে কী করা উচিত তা একটি পদ্ধতি অবহিত)।


7

আমি দেখতে পাচ্ছি যে এখানে আপনার কাছে জাভা ট্যাগ রয়েছে তাই আমি জাভাটিকে উদাহরণ হিসাবে ব্যবহার করব যদিও প্যাটার্নটি প্ল্যাটফর্ম নির্দিষ্ট নয়।

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

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

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

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


7

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

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

এবং পরে:

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

কেন কাগজ এক্সপ্লোর নেই না এই বাগ্ধারা ব্যবহার করতে, কিন্তু এটা বর্ণনা করে কেন বাগ্ধারা ভাষা পর্যায়ের সাহায্য ছাড়া ভুল পেতে সহজ:

ত্রুটিযুক্ত কোড স্যান্ডউইচগুলি ব্যতিক্রম এবং তাদের সম্পর্কিত অদৃশ্য নিয়ন্ত্রণের প্রবাহের উপস্থিতিতে সবচেয়ে বেশি ঘন ঘন দেখা দেয়। প্রকৃতপক্ষে, কোড স্যান্ডউইচগুলি পরিচালনা করার জন্য বিশেষ ভাষার বৈশিষ্ট্যগুলি মূলত ব্যতিক্রমগুলিকে সমর্থন করে এমন ভাষায় উত্থিত হয়।

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


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

4

আমি ব্যাখ্যা করার চেষ্টা করব, যেমনটি আমি চার বছরের বয়সের জন্য চাই:

উদাহরণ 1

সান্তা শহরে আসছে। তার এলভাস কোডগুলি তারা তার পিছনে পিছনে যা কিছু চায় কোডটি এবং তারা পরিবর্তন না করে কিছুটা পুনরাবৃত্তি পেতে পারে:

  1. মোড়কের কাগজ পান
  2. সুপার নিন্টেন্ডো পান ।
  3. এটি মোড়ানো.

অথবা এটা:

  1. মোড়কের কাগজ পান
  2. পান বার্বি পুতুল
  3. এটি মোড়ানো.

.... বিজ্ঞাপন লক্ষ লক্ষ লক্ষ মিলিয়ন বিভিন্ন উপস্থাপনার সাথে লক্ষ্য করুন: লক্ষ্য করুন যে একমাত্র জিনিসটি দ্বিতীয় ধাপ 2 If 1 এবং 3 মিলিয়ন বার? এক মিলিয়ন উপহারের অর্থ হল যে তিনি অযথা 1 এবং 3 মিলিয়ন বার পুনরাবৃত্তি করছেন।

চারপাশে চালানো সমস্যাটি সমাধান করতে সহায়তা করে। এবং কোড দূর করতে সহায়তা করে। পদক্ষেপ 1 এবং 3 মূলত ধ্রুবক হয়, ধাপ 2 কে পরিবর্তিত হয় এমন একমাত্র অংশ হতে দেয়।

উদাহরণ # 2

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

এখন আপনি যদি উপরের ব্যাখ্যাগুলি পড়েন তবে সম্ভবত আপনি এটি বুঝতে সহজতর হবেন। আমি আশা করি এই ব্যাখ্যা আপনাকে সাহায্য করেছিল।


+ কল্পনার জন্য: ডি
স্যার। হেজেহোগ

3

এটি আমাকে কৌশল ডিজাইনের ধরণ সম্পর্কে মনে করিয়ে দেয় । লক্ষ্য করুন যে আমি যে লিঙ্কটি নির্দেশ করেছি তাতে প্যাটার্নটির জন্য জাভা কোড অন্তর্ভুক্ত রয়েছে।

স্পষ্টতই একজন ইনিশিয়েশন এবং ক্লিনআপ কোড তৈরি করে এবং কেবল একটি কৌশল পাস করার মাধ্যমে "প্রায়শই কার্য সম্পাদন" সম্পাদন করতে পারে যা সর্বদা আরম্ভ এবং ক্লিনআপ কোডে আবৃত থাকবে।

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

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


0

আপনি যদি গ্রোভি আইডিয়ামগুলি চান তবে এটি এখানে:

//-- the target class
class Resource { 
    def open () { // sensitive operation }
    def close () { // sensitive operation }
    //-- target method
    def doWork() { println "working";} }

//-- the execute around code
def static use (closure) {
    def res = new Resource();
    try { 
        res.open();
        closure(res)
    } finally {
        res.close();
    }
}

//-- using the code
Resource.use { res -> res.doWork(); }

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