আমি কি সেই ফাংশনটি রেখেছি যা কেবলমাত্র অন্য একটি ফাংশনে ব্যবহৃত হয়?


30

বিশেষত, আমি জাভাস্ক্রিপ্ট লিখছি।

ধরা যাক আমার প্রাথমিক ফাংশনটি ফাংশন এ। যদি ফাংশন এ ফাংশন বিতে বেশ কয়েকটি কল করে তবে ফাংশন বি অন্য কোথাও ব্যবহার করা হয় না, তবে আমি কি কেবল ফাংশন এ এর ​​মধ্যে ফাংশন বি স্থাপন করব?

এটা কি ভাল অনুশীলন? অথবা আমি এখনও ফাংশন বি ফাংশন এ এর ​​একই সুযোগে রাখা উচিত?

উত্তর:


32

আমি সাধারণত নেস্টেড ফাংশনগুলির পক্ষে, বিশেষত জাভাস্ক্রিপ্টের পক্ষে।

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

আমি মনে করি যে প্রচুর বিরোধিতা এ থেকে আসে যে বেশিরভাগ প্রোগ্রামার হয় হয় সি / সি ++ / জাভা traditionতিহ্যে উত্থিত হয়েছিল, বা কে ছিল সে দ্বারা শিখিয়েছিল। নেস্টেড ক্রিয়াকলাপগুলি প্রাকৃতিক বলে মনে হচ্ছে না কারণ আমরা যখন প্রোগ্রাম শিখছিলাম তখন আমরা তাদের কাছে খুব বেশি প্রকাশ পাইনি। এর অর্থ এই নয় যে তারা কার্যকর নয়।


14

আপনার এটি বেশ কয়েকটি কারণে বিশ্বব্যাপী সুযোগে রাখা উচিত।

  • কলারের মধ্যে কোনও সহায়ক ফাংশন বাসা বেঁধে কলারের দৈর্ঘ্য বাড়ায়। ফাংশন দৈর্ঘ্য প্রায় সর্বদা একটি নেতিবাচক সূচক; সংক্ষিপ্ত ফাংশনগুলি বোঝা সহজ, মুখস্ত করা, ডিবাগ করা এবং বজায় রাখা সহজ।

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

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

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

সম্পাদন করা

এটি আমার চেয়ে বেশি বিতর্কিত প্রশ্নে পরিণত হয়েছিল। স্পষ্ট করা:

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

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


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

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

2
এটি একটি দুর্দান্ত উত্তর। অভ্যন্তরীণ ফাংশনগুলি ব্যবহার করার সময় ভাঙ্গা এনক্যাপসুলেশন সমস্যা এমন কিছু যা অনেকে বিবেচনা করে না।
এসবিচেনকো

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

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

8

আমি একটি তৃতীয় পাথ প্রস্তাব করতে যাচ্ছি, উভয় ফাংশন বন্ধের মধ্যে স্থাপন করতে। এটি দেখতে যেমন হবে:

var functionA = (function(){
    function functionB() {
        // do stuff...
    }

    function functionA() {
        // do stuff...
        functionB();
        // do stuff...
    }

    return functionA;
})();

আমরা একটি আইআইএফই উভয় ফাংশন এর ঘোষণা মোড়ক দ্বারা ক্লোজার তৈরি । IIFE এর রিটার্ন মান হ'ল পাবলিক ফাংশন, ফাংশনের জন্য নামের একটি ভেরিয়েবলে সঞ্চিত। পাবলিক ফাংশনটি ঠিক একইভাবে ডাকা যেতে পারে যেমন এটি কোনও বিশ্বব্যাপী ফাংশন হিসাবে ঘোষিত হয়েছিল, যেমন functionA()। মনে রাখবেন যে রিটার্ন মান হ'ল ফাংশন , ফাংশনে কোনও কল নয়, সুতরাং শেষে কোনও প্যারেন্স নেই।

দুটি ফাংশন মোছার মতো করে functionBএখন সম্পূর্ণ ব্যক্তিগত, এবং বন্ধের বাইরে অ্যাক্সেস করা যায় না, তবে এটি কেবল দৃশ্যমান functionA। বিশ্বব্যাপী নামস্থান cluttering করা হয় না, এবং সংজ্ঞা cluttering নয় functionA


0

ফাংশন এ এর ​​মধ্যে ফাংশন বি সংজ্ঞা দেওয়া ফাংশন বি এর এ এর ​​অভ্যন্তরীণ ভেরিয়েবলগুলিতে অ্যাক্সেস দেয়।

সুতরাং, একটি ফাংশন এ এর ​​মধ্যে বি সংজ্ঞায়িত একটি ফাংশন বি দ্বারা এ এর ​​স্থানীয় ভেরিয়েবলগুলি ব্যবহার করছে বা পরিবর্তন করছে এমন ছাপ দেয় (বা কমপক্ষে সম্ভাব্যতা)। এ এর বাইরের বি সংজ্ঞা দেওয়ার সময় এটি পরিষ্কার করে দেয় যে বি হয় না।

সুতরাং কোডের স্বচ্ছতার জন্য আমি বি এর সংজ্ঞা কেবলমাত্র এ এর ​​মধ্যে দিয়ে থাকব যদি বি এর এ এর ​​স্থানীয় ভেরিয়েবল অ্যাক্সেস করতে হয় তবে বি এর A এর স্বতন্ত্র উদ্দেশ্য আছে তবে আমি অবশ্যই এ এর ​​বাইরে এটি সংজ্ঞায়িত করব।


-1

আপনার এটি বাসাতে হবে না কারণ অন্যথায় আপনি যখনই বাইরের ফাংশনটি কল করবেন তখন নেস্টেড ফাংশনটি পুনরায় তৈরি হবে।


-3

যেহেতু ফাংশন বি অন্য কোথাও ব্যবহৃত হয় না আপনি এটিকে কেবল ফাংশন এ এর ​​অভ্যন্তরীণ মজাদার হিসাবে তৈরি করতে পারেন কারণ এটি উপস্থিত থাকার একমাত্র কারণ।


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