আংশিক ক্লাস কেন ব্যবহার করবেন?


72

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

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


10
এটি আসলে কোনও "সম্পূর্ণ কীওয়ার্ড" নয়। এটি একটি প্রাসঙ্গিক কীওয়ার্ডpartialএর আগে যখন কিছু আসে তখন কেবল তার অর্থ class। আপনি কোডের অন্যান্য অংশগুলিতে এটি সনাক্তকারী নাম হিসাবে ব্যবহার করতে পারেন
ডিন হার্ডিং

4
আপনি যদি এগুলি ব্যবহার করেন এবং এটি উত্পন্ন কোডের জন্য না হয় তবে আমি আপনাকে ঘৃণা করি। আপনি ব্যক্তিগতভাবে নয়, তবে আপনি সাধারণত আমি আংশিক ক্লাসের মাধ্যমে কোড ডাউন শিকারকে ঘৃণা করি।
স্টিভেন এভার্স

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

2
এটি একটি ভুল বোঝাবুঝি যে আংশিক ক্লাসগুলি পৃথক ফাইলগুলিতে থাকতে হবে।
বার্ট

উত্তর:


110

এটি প্রতিটি দৃশ্যে খুব দরকারী যেখানে শ্রেণীর একটি অংশ কিছু কাস্টম সরঞ্জাম দ্বারা উত্পাদিত হয়েছে কারণ এটি আপনাকে উত্পন্ন শ্রেণীর উত্তরাধিকার ছাড়াই উত্পাদিত কোডে কাস্টম লজিক যুক্ত করতে দেয়। BTW। একই কারণে আংশিক পদ্ধতিও রয়েছে।

এটি কেবল ইউআই সম্পর্কেই নয়, লিনক-টু-এসকিএল বা সত্তা ফ্রেমওয়ার্কের মতো অন্যান্য প্রযুক্তিও এটি বেশ ভারী ব্যবহার করে।


44
এছাড়াও, উত্পন্ন কোডটি সংস্করণ নিয়ন্ত্রণের বাইরে রেখে যাওয়ার সময় এটি আপনাকে কোডটি সংস্করণ নিয়ন্ত্রণে রাখতে দেয়।
ফ্র্যাঙ্ক শায়ারার

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

1
আমি যে সর্বোত্তম উদাহরণ ব্যবহার করেছি তা হ'ল: ক) লিনকের এসকিউএল ডেটা প্রসঙ্গে যেখানে আপনি ক্লাসগুলি প্রসারিত করতে চান; খ) ওয়েব পরিষেবা থেকে পাস করা ক্লাসগুলি বাড়ানো। উভয় ক্ষেত্রেই এটি অপব্যবহার নয় এবং ফাইল আকারের ব্যবস্থাপনার উপায়ও নয় ... আমি এটিকে সেই পদ্ধতিতে ব্যবহার করে দেখে প্রচন্ডভাবে অসন্তুষ্ট হব (এবং পদক্ষেপ গ্রহণ করবে ...)
মারফ

3
উইনফর্ম ক্লাসগুলি সমস্ত ডিজাইনার কোড তৈরির নিয়ন্ত্রণগুলি আড়াল করার জন্য এটি ব্যবহার করে (বিশেষত গুরুত্বপূর্ণ কারণ ডিজাইনার এলোমেলোভাবে সমস্ত কোডগুলিকে পুনরায় সাজিয়ে তুলতে পছন্দ করে যা এর ফলে বিশাল মেসের ফলে পৃথক / দোষারোপ করে) এবং আপনি যদি এক্সএমএল এর সাথে কাজ করছেন তবে এক্সএসডি সরঞ্জামটি করতে পারে স্কিমা ফাইলের বাইরে আবার আংশিক ক্লাস তৈরি করুন যা আপনাকে নিজের কোডটি স্বয়ংক্রিয়ভাবে উত্পন্ন সাজানোর থেকে আলাদা করতে দেয়।
ড্যান নীলি

2
পছন্দ করেছেন উত্তরাধিকারের কোডে Godশ্বরের অবজেক্টগুলিকে রিফেক্টর করার জন্য এটি একটি ভাল সূচনা পয়েন্ট। প্রথমে বড় ক্লাসগুলিকে পৃথক ফাইলে বিভক্ত করে ল্যান্ডস্কেপটি সাফ করার চেষ্টা করুন। (আমি জানি আপনার মন্তব্যটি খুব পুরানো)
কনরাড মোরাউস্কি

26

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

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

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


9
আমি ইন্টারফেস বাস্তবায়ন পৃথক করার জন্য ক্লাস পার্টিশালগুলি ব্যবহার করার কথা ভাবি না, এটি একটি দুর্দান্ত ধারণা।
মার্ক বুথ

এটি স্টাইলের চেয়ে অনেক বেশি। একটি কোড জেনারেটরের বিকাশকারীদের আপনাকে জেনারেটর দ্বারা পরিচালিত কোনও ফাইলে কোড সম্পাদনা করার অনুমতি দেওয়ার জন্য হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়তে হবে এবং তারপরেও এটি সমস্যাযুক্ত হবে। আমার কাছে # 1 সুবিধাটি আপনাকে কোড লেখার জন্য একটি জায়গা দিচ্ছে যা জেনারেটর স্পর্শ করতে পারে না / করতে পারে না। এটি একটি সুন্দর বাস্তব সুবিধা।
ড্যানিয়েল

19

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

তবে, আমি সাধারণভাবে মনে করি যে নতুন কোড লেখার সময় সেগুলি কেবলমাত্র জেনারেটেড ক্লাস বাড়ানোর ক্ষেত্রে ব্যবহার করা উচিত।


1
আমি দেখতে পারি যে এটি কীভাবে কার্যকর হতে পারে। এটি ভাষায় থাকার জন্য এটি ন্যায়সঙ্গত কিনা বা না ... আমি জানি না। যদিও মেশিনটি জেনারেটেড কোডের অন্য গল্প, যদিও।
মাইকেল কে

2
হ্যাঁ, এটি ভাষায় হওয়া কোনও ন্যায়সঙ্গততা নয়, তবে এগুলি ব্যবহারের আকর্ষণীয় উপায়।

18

আমি কয়েকটি দরকারী পরিস্থিতি সম্পর্কে ভাবতে পারি যেখানে পার্টিয়ালগুলি বোঝায়, তাদের বেশিরভাগটি আমি আমার প্রকল্পগুলিতে নিজেকে ব্যবহার করছি:

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

  • আপনি যখন প্রয়োগের ক্ষেত্রে প্রচুর কোড সহ একাধিক ইন্টারফেস প্রয়োগ করেন। আমি প্রতিটি যেমন ইন্টারফেসের জন্য একটি পৃথক আংশিক ফাইল ব্যবহার করতে, এটা ভালো নামকরণ ঝোঁক: {Class}.{Interface}.cs। আইডিইতে কোনটি ইন্টারফেস {Class}প্রয়োগ করছে এবং কীভাবে তা কার্যকর করা আমার পক্ষে সহজ ।

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

  • আমি যখন staticক্লাস লিখি যা এক্সটেনশন পদ্ধতি রাখে । একই ধরণের ক্লাস বা ইন্টারফেসগুলিতে যেমন একই বর্ধনের পদ্ধতির যুক্তি সরবরাহ করা সাধারণত ক্ষেত্রে Reverseহয় - যেমন জেনেরিক এবং নন-জেনেরিক সংগ্রহের ক্ষেত্রে। আমি একক শ্রেণি বা ইন্টারফেসের জন্য সমস্ত বর্ধিত পদ্ধতি স্থিতিক শ্রেণীর পৃথক আংশিক অংশে রাখি। উদাহরণস্বরূপ, আমার কাছে IListএক জায়গায় ইন্টারফেসের জন্য সমস্ত এক্সটেনশন পদ্ধতি IList<T>এবং অন্য ফাইলের জন্য একই পদ্ধতি রয়েছে । আর একটি পদ্ধতি হ'ল thisপ্যারামিটারের জন্য সমস্ত সম্ভাব্য ক্লাস সহ একই পদ্ধতি (তার সমস্ত ওভারলোডগুলি) একই আংশিক স্থানে স্থাপন করা - যেমন সমস্ত রয়েছেReverseএকটি ফাইলে বাস্তবায়ন। কোড ভলিউমের ক্ষেত্রে কোনটি পৃথকীকরণকে আরও ভালভাবে প্রমাণ করতে পারে তা নির্ভর করে, বা আপনি বা আপনার সংস্থার কিছু অভ্যন্তরীণ কনভেনশন থাকতে পারে depends

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

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


14

আমি এটি কারও দ্বারা উল্লেখ করা দেখিনি: আমি partialতাদের নিজস্ব ফাইলে নেস্টেড ক্লাসগুলি ব্যবহার করতাম ।

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

এটাও এর মানে হল যে একটি শ্রেণী NestedClassভিতরে নেস্টেড MyClassআমার প্রকল্পে এটা নিজস্ব ফাইল হবে: MyClass.NestedClass.cs

partial class MyClass
{
    private class NestedClass
    {
        // ...
    }
}

1
আমি ভাবছি কেন কেউ এই উত্তরটি নীচে ভোট দেবে। উল্লিখিত অনুশীলনটি কোনও একটি বিরোধী-নিদর্শন নয়, এটি আমার জানা কোনও সমস্যা সৃষ্টি করবে না।
আইভায়লো স্লাভভ

1
এটি অভ্যন্তরীণ শ্রেণীর অন্তর্গত এমন কোডের যথাযথ এনক্যাপসুলেশনকে অনুমতি দেওয়ার সময় শ্রেণি ফাইলগুলিকে ছোট রাখার (কোডের লাইনের শর্তাবলী) সমস্যাটিকেও সম্বোধন করে।
redcalx

10

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

সুতরাং আপনি যখন জিজ্ঞাসা করবেন Why use partial classes?আমি উত্তর: আপনি উত্পন্ন কোড ব্যবহার না করা না, না।


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

6

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

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

1

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


1

আমি তাদের জন্য একটি নোংরা ব্যবহার সম্পর্কে ভাবতে পারি।

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

মূলত আপনি একাধিক উত্তরাধিকার করতে চান তবে সি # কোনও পছন্দ নেই। সুতরাং আপনি যা করেন তা তৈরিতে আংশিক ব্যবহার হ'ল সি / সি ++ এ মূলত একটি # অন্তর্ভুক্ত;

সমস্ত কার্যকারিতা একটি শ্রেণিতে রাখুন, বা সহায়ক শ্রেণিটি ব্যবহার করুন। তারপরে সহায়কটিকে X বার অনুলিপি করুন এবং এর আংশিক শ্রেণি A, B, C নামকরণ করুন। এবং আপনার এ, বি, সি ক্লাসে আংশিক রাখুন।

দাবি অস্বীকার: হ্যাঁ, এটা খারাপ। এটি কখনই করবেন না - বিশেষত যদি এটি অন্য লোকেদের আপনাকে ক্ষিপ্ত করে তোলে।


Mixins। ম্যানুয়াল অনুলিপি এড়ানোর জন্য এটি টি 4 এর সাথে একত্রিত হতে পারে ...
পিটার টেলর

যেমনটি উল্লেখ করা হয়েছে, এটি মিশ্রণের সাথে খুব সাদৃশ্যপূর্ণ। তবে, আপনি "বৈশিষ্ট্য" হিসাবে পরিচিত একটি ধারণার কাছে পৌঁছে যাচ্ছেন এবং আপনি কী অর্জন করার চেষ্টা করছেন তা তারা নিরাপদে পরিচালনা করবে। আমার publius - ovidius.livej पत्रकार . com/314737.html এ ভাষা-অজ্ঞান সম্পর্কিত বর্ণনা আছে আমি সি # এর জন্য একটি পরিষ্কার বাস্তবায়ন খুঁজছি , তবে একটিও দেখিনি।
ওভিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.