খাঁটি নান্দনিক কারণে নেস্টেড ফাংশন তৈরি করছেন?


16

খালি নান্দনিক ফাংশন তৈরির ধারণা সম্পর্কে অন্যান্য প্রোগ্রামাররা কী ভাবছেন তা আমি সর্বদা ভাবছি।

আমি একটি ফাংশন যা ডেটার একটি খণ্ড প্রক্রিয়া আছে বলুন, Function ProcessBigData। আমি যে ডেটার জন্য বিভিন্ন প্রক্রিয়া পদক্ষেপ প্রয়োজন, শুধুমাত্র বৈধ বলুন, Step1, Step2, Step3

সোর্স কোডে সর্বাধিক সর্বাধিক আমি দেখি এমন সাধারণ অ্যাপ্রোচ হ'ল মন্তব্যগুলি লিখতে:

Function ProcessBigData:
    # Does Step1
    Step1..
    Step1..

    #Does Step2
    Step2..
    Step2..

আমি সাধারণত যা করি, তবে সহকর্মীদের দ্বারা এই জাতীয় কোডিং শৈলীর অভাবের কারণে সর্বদা ভুল অনুভব করি:

Function ProcessBigData:
    Function Step1:
        Step1..
        Step1..

    Function Step2:
        Step2..
        Step2..

    Step1() -> Step2()

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

এমন কোন বিকল্প আছে যা আমি দেখছি না?


3
পাইথন সম্পর্কে আমি কিছুই বলতে পারি না, তবে জাভাস্ক্রিপ্টের জন্য, নেস্টেড ফাংশনগুলির জন্য একটি কার্যকারিতা ব্যয় রয়েছে: বেশিরভাগ জাভাস্ক্রিপ্ট ইঞ্জিন সম্মিলিত পরিবর্তনশীল সুযোগের জন্য একটি লিঙ্ক-তালিকা-জাতীয় কাঠামো ব্যবহার করে। ফাংশনগুলির একটি অতিরিক্ত স্তর যুক্ত করে ইঞ্জিনটি ভেরিয়েবলগুলি সমাধান করার সময় সম্ভবত দীর্ঘতর / বৃহত্তর ডেটা-কাঠামো অনুসন্ধান করতে বাধ্য করে। অন্যদিকে, সমস্ত অশুভের মূল অবশ্যই অকাল অপ্টিমাইজেশন। :)
মার্কো

উত্তর:


4

আপনি যতটা ভাবতে পারেন তেমন অদ্ভুত নয়। উদাহরণস্বরূপ, স্ট্যান্ডার্ড এমএলে সাহায্যকারীর কার্যকারিতা সীমাবদ্ধ করার প্রথাগত। মঞ্জুর, এসএমএলের এটির সুবিধার্থে বাক্য গঠন রয়েছে:

local
    fun recursion_helper (iteration_variable, accumulator) =
        ... (* implementation goes here *)
in
    fun recursive_function (arg) = recursion_helper(arg, 0);
end

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

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


11

যখনই সম্ভব সম্ভব এটি করা ভাল, তবে আমি এই ধরণের কাজটি "পদক্ষেপ" হিসাবে নয়, সাবটাস্ক হিসাবে ভাবতে চাই

এটি একটি নির্দিষ্ট দায়িত্ব আছে, এবং সংজ্ঞায়িত ইনপুট (গুলি) এবং আউটপুট (গুলি) (মনে: একটি subtask কাজ একটি নির্দিষ্ট ইউনিট যে কাজ করা যেতে পারে হয় "এস" মধ্যে কঠিন )। একটি সাবটাস্ক পুনরায় ব্যবহারের প্রয়োজন হয় না: কিছু লোকের মনে হয় "" আমাকে আর কোনও কিছু থেকে কল করতে হবে না তাই এটিকে কেন একটি ফাংশন হিসাবে লিখি? " তবে এটি একটি ভ্রান্তি।

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

পঠনযোগ্যতার।

পদ্ধতিগত কোডের 200+ লাইন (একটি ফাংশনের মূল অংশ) পড়া শক্ত read 2-20 লাইন ফাংশনগুলি পড়া সহজ। কোড মানুষের জন্য।

নেস্টেড বা না, আপনি মূলত পঠনযোগ্যতার সুবিধা পান, যদি না আপনি পিতামাতার স্কোপ থেকে প্রচুর ভেরিয়েবল ব্যবহার করেন তবে এক্ষেত্রে এটি পড়া ঠিক ততটাই কঠিন হতে পারে।

পরিবর্তনশীল সুযোগ সীমাবদ্ধ

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

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

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

ইউনিট পরীক্ষা

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

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

একটি দল / টপ-ডাউন ডিজাইনে কাজ করা

সাবটাস্কগুলি প্রয়োজন অনুসারে স্বতন্ত্রভাবে বিভিন্ন ব্যক্তি লিখতে পারেন।

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

কোড পুনরায় ব্যবহার

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

প্রায়শই পুনরায় ব্যবহারের অর্থ কিছু রিফ্যাক্টরিং হয়, যা পুরোপুরি প্রত্যাশিত হয়, তবে একটি ছোট স্ট্যান্ডেলোন ফাংশনে ইনপুট পরামিতিগুলি রিফ্যাক্ট করা এটি 200+ লাইন ফাংশনটি লেখার কয়েক মাস পরে এটি উত্তোলনের চেয়ে অনেক সহজ, যা এখানে সত্যই আমার বক্তব্য।

যদি আপনি কোনও নেস্টেড ফাংশন ব্যবহার করেন তবে এটিকে পুনরায় ব্যবহার করা সাধারণত কোনও পৃথক ফাংশনে রিফ্যাক্ট করার বিষয়, যা আবার, কেন আমি যুক্তি দিয়েছি যে নেস্টেড যাওয়ার উপায় নয়।


2
এগুলি সাধারণভাবে ফাংশনগুলি ব্যবহারের জন্য কিছু সত্যিকারের বৈধ পয়েন্ট, তবে আপনি যদি মনে করেন নিস্টেড ফাংশনগুলি একটি ভাল ধারণা। অথবা আপনি প্রবাহের সুযোগগুলিতে ফাংশনগুলি পেতে পারেন?
স্লিটায়েল

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