আমার কোনও কার্যক্রমে নির্দিষ্ট কার্যকারিতা বের করতে হবে এবং কেন?


29

আমার কাছে একটি বৃহত পদ্ধতি রয়েছে যা 3 টি কাজ করে, তাদের প্রত্যেককে আলাদা ফাংশনে তোলা যায়। যদি আমি সেই প্রতিটি কাজের জন্য একটি অতিরিক্ত ফাংশন করব তবে এটি আমার কোডটি আরও ভাল বা খারাপ করে দেবে এবং কেন?

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

সমস্ত কোড লেখার আগে আমার কি তা করা উচিত বা সবকিছু শেষ না হওয়া পর্যন্ত এটি ছেড়ে দেওয়া উচিত এবং তারপরে ফাংশনগুলি বের করা উচিত?


19
"সবকিছু শেষ না হওয়া পর্যন্ত আমি এটি ত্যাগ করি" সাধারণত "এটি কখনই করা হবে না" এর সমার্থক।
ইউফোরিক

2
এটি সাধারণত সত্য, তবে YAGNI এর বিপরীত নীতিটিও মনে রাখবেন (যা এই ক্ষেত্রে প্রযোজ্য নয়, যেহেতু আপনার ইতিমধ্যে এটি প্রয়োজন)।
ঝাঁকুনি দেওয়া


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

উত্তর:


35

এটি এমন একটি বই যা আমি প্রায়শই লিঙ্ক করি তবে এখানে আমি আবার যাই: রবার্ট সি মার্টিনের ক্লিন কোড , অধ্যায় 3, "ফাংশনস"।

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

আপনি কি +150 লাইনের সাথে কোনও ফাংশন পড়া বা 3 +50 লাইন ফাংশন কলকারী কোনও ফাংশন পছন্দ করেন? আমি মনে করি আমি দ্বিতীয় বিকল্পটি পছন্দ করি।

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

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

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

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

সমস্ত কোড লেখার আগে আমার কি তা করা উচিত বা সবকিছু শেষ না হওয়া পর্যন্ত এটি ছেড়ে দেওয়া উচিত এবং তারপরে ফাংশনগুলি বের করা উচিত?

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


10
আসলে, বব মার্টিন বেশ কয়েকবার দেখিয়েছেন যে তিনি 15 টি লাইনের সাথে একটি ফাংশনের উপরে 2 থেকে 3 লাইনের সাথে 7 টি ফাংশন পছন্দ করেন (এখানে সাইটগুলি জিমেইল / সাইট / ইউনালববকনসুলটিংএলসি / দেখুন )। এমনকি সেখানে প্রচুর অভিজ্ঞ দেবগণও প্রতিরোধ করছেন। ব্যক্তিগতভাবে, আমি মনে করি যে এই "অভিজ্ঞ দেবগণ" বেশিরভাগেরই মেনে নিতে সমস্যা হয় যে তারা এখনও> 10 বছর কোডিংয়ের পরে ফাংশনগুলি দিয়ে বিমূর্ততা তৈরি করার মতো প্রাথমিক বিষয়টিতে উন্নতি করতে পারেন।
ডক ব্রাউন

কেবলমাত্র একটি বই উল্লেখ করার জন্য +1 যা আমার বিনয়ী মতামতের জন্য কোনও সফ্টওয়্যার সংস্থার তাকের মধ্যে থাকা উচিত।
ফ্যাবিও মার্কোলিনি

3
আমি এখানে প্যারাফ্রেসিং করতে পারি, তবে সেই বইয়ের একটি বাক্যাংশ যা প্রায় প্রতিদিন আমার মাথায় প্রতিধ্বনিত হয় "প্রতিটি ফাংশনটিতে কেবল একটি কাজ করা উচিত, এবং এটি ভালভাবে করা উচিত"। ওপিকে "আমার মূল ফাংশনটি তিনটি কাজ করে" বলে
ওয়াপজাহ

তুমি একদমই সঠিক!
জালান

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

13

হ্যাঁ, অবশ্যই যদি একক ফাংশনের বিভিন্ন "কার্য" দেখতে এবং পৃথক করা সহজ হয়।

  1. পঠনযোগ্যতা - ভাল নাম সহ ফাংশনগুলি এ কোডটি পড়ার প্রয়োজন ছাড়াই কোন কোডটি করে তা স্পষ্ট করে তোলে।
  2. পুনঃব্যবহারযোগ্যতা - আপনার প্রয়োজনীয় জিনিসগুলি না করে এমন ফাংশন রাখার চেয়ে একাধিক জায়গায় একটি কাজ করে এমন ফাংশনটি ব্যবহার করা সহজ।
  3. টেস্টিবিলিটি - ফাংশনটি পরীক্ষা করা আরও সহজ, এর একটি "ফাংশন" সংজ্ঞায়িত হয়েছে, যার অনেকগুলি রয়েছে

তবে এতে সমস্যা হতে পারে:

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

5

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

লম্বা ফাংশন এবং পদ্ধতিগুলি ছোট কিছুতে বিভক্ত করা ঠিক কি, যদিও এগুলি অন্য কোনও কারণে ডাকা হবে না?

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

প্রো:

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

বিরূদ্ধে:

  • এটি আপনার পর্দার অনেক পৃষ্ঠা নেয়;
  • এটি পড়তে দীর্ঘ সময় লাগে;
  • সমস্ত বিভিন্ন পদক্ষেপ মুখস্থ করা সহজ নয়;

এখন কল্পনাটি করা যাক দীর্ঘ ফাংশনটিকে কয়েকটি উপ-ফাংশনে বিভক্ত করা যায় এবং তাদেরকে আরও বিস্তৃত সম্ভাবনার সাথে দেখে।

প্রো:

  • ছুটির কাজগুলি বাদে প্রতিটি ফাংশন শব্দের সাথে বর্ণনা করে (উপ-ফাংশনগুলির নাম) বিভিন্ন ধাপগুলি সম্পন্ন করে;
  • প্রতিটি একক ফাংশন / উপ-ফাংশন পড়তে খুব কম সময় লাগে;
  • প্রতিটি উপ-ফাংশনে (উদ্বেগের বিভাজন) কোন প্যারামিটার এবং ভেরিয়েবলগুলি প্রভাবিত হবে তা স্পষ্ট;

বিরূদ্ধে:

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

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


2

আমার জন্য কোড ব্লকগুলি ফাংশনগুলিতে উত্তোলনের চারটি কারণ রয়েছে:

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

  • এটি একটি কলব্যাক : এটি ইভেন্ট হ্যান্ডলার বা কোনও ধরণের ব্যবহারকারী কোডের একটি লাইব্রেরি বা ফ্রেমওয়ার্ক কল calls (ফাংশন না করেই আমি খুব কমই এটি কল্পনা করতে পারি))

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

  • আপনি স্ব-ডকুমেন্টিং কোড চান : সুতরাং কোডের ব্লকটির উপর মন্তব্যগুলির একটি লাইন লেখার পরিবর্তে এটি কী করে তা সংক্ষিপ্ত করে, আপনি পুরো জিনিসটিকে একটি ফাংশনে সরিয়ে ফেলুন এবং আপনি একটি মন্তব্যে কী লিখবেন তা নাম দিন। যদিও আমি এটির অনুরাগী নই, কারণ আমি ব্যবহৃত অ্যালগরিদমের নামটি লিখতে পছন্দ করি কারণ কেন আমি সেই অ্যালগরিদমকে বেছে নিয়েছি etc. ইত্যাদি ফাংশনটির নামগুলি তখন খুব দীর্ঘ হবে ...


1

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

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


0

পাশে: আমি ডালিনের প্রশ্নের জবাবে এটি লিখেছিলাম (এখন বন্ধ) তবে আমি এখনও মনে করি এটি কারও পক্ষে সহায়ক হতে পারে তাই এখানে যায়


আমি মনে করি যে atomizing ফাংশনগুলির কারণটি 2 গুণ এবং @jozefg উল্লেখ হিসাবে ব্যবহৃত ভাষার উপর নির্ভরশীল।

উদ্বেগ বিচ্ছেদ

এটি করার মূল কারণ হ'ল কোডের বিভিন্ন অংশ পৃথক করে রাখা, সুতরাং যে কোনও কোডের ব্লক যা ফাংশনটির কাঙ্ক্ষিত ফলাফল / অভিপ্রায় সরাসরি অবদান রাখে না এটি একটি পৃথক উদ্বেগ এবং এটি বের করা যেতে পারে।

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

জাভাস্ক্রিপ্টে বলুন আপনার কাছে getMyData () একটি ফাংশন রয়েছে, যা 1) পরামিতিগুলি থেকে একটি সাবান বার্তা তৈরি করে, 2) একটি পরিষেবা রেফারেন্স সূচনা করে, 3) সাবান বার্তা দিয়ে পরিষেবাটি কল করে, 4) ফলাফলকে পার্স করে, 5) ফলাফলটি ফেরত দেয়। যুক্তিসঙ্গত বলে মনে হচ্ছে, আমি এই নিখুঁত ফাংশনটি বহুবার লিখেছি - তবে সত্যিই এটি কেবলমাত্র 3 এবং 5 এর কোড সহ 3 ব্যক্তিগত ফাংশনে বিভক্ত হতে পারে (যদি তা হয়) তবে অন্য কোডগুলির কোনওটিই পরিষেবা থেকে ডেটা পাওয়ার জন্য সরাসরি দায়বদ্ধ নয় ।

ডিবাগিংয়ের অভিজ্ঞতা উন্নত

আপনার যদি সম্পূর্ণ পারমাণবিক ক্রিয়া থাকে তবে আপনার স্ট্যাক ট্রেস সফলভাবে সম্পাদিত সমস্ত কোডের তালিকা করে টাস্ক তালিকায় পরিণত হয়, যেমন:

  • আমার ডেটা পান
    • সাবান বার্তা তৈরি করুন
    • পরিষেবা রেফারেন্স সূচনা করুন
    • পার্সড পরিষেবাদির প্রতিক্রিয়া - ত্রুটি

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

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

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

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