ক্লাসগুলিকে কেন "খোলা" হতে ডিজাইন করা উচিত নয়?


44

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

এর পিছনে ধারণাটি বাস্তবায়নের বিশদটি গোপন করা, এটি খুব ভাল কারণ। তবে protectedবেশিরভাগ ওওপি ভাষা এবং বহুকর্মের অস্তিত্বের সাথে , এটি কার্যকর হয় না।

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

  • ক্লাসটি প্রসারিত করবেন না, কেবল কোডটিকে আরও জটিল করে তোলার সমস্যার সমাধান করুন
  • পুরো ক্লাসটি অনুলিপি করুন এবং কোড পুনরায় ব্যবহারযোগ্যতা হ্রাস করুন paste
  • প্রকল্পটি কাঁটাচামচ করুন

এগুলি ভাল বিকল্প নয়। protectedএটি সমর্থন করে এমন ভাষায় লিখিত প্রকল্পগুলিতে কেন ব্যবহার করা হচ্ছে না ? কিছু প্রকল্প কেন তাদের ক্লাস থেকে উত্তরাধিকার সূত্রে নিষিদ্ধ করে?


1
আমি সম্মত, জাভা সুইং উপাদানগুলির সাথে আমার এই সমস্যা হয়েছে, এটি সত্যিই খারাপ।
জোনাস


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

2
"বেশিরভাগ ওওপি ভাষা?" আমি আরও অনেক কিছু জানি যেখানে ক্লাস বন্ধ করা যায় না। আপনি চতুর্থ বিকল্পটি রেখে গেছেন: ভাষা পরিবর্তন করুন।
কেভিন cline

@ জোনাস সুইংয়ের অন্যতম প্রধান সমস্যা হ'ল এটি খুব বেশি বাস্তবায়নের উপায় প্রকাশ করে। যা সত্যিই উন্নয়নকে মেরে ফেলেছে।
টম হাটিন -

উত্তর:


55

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

সুতরাং এটি এতটা নয় যে ক্লাসগুলি উন্মুক্ত না হওয়া উচিত, তবে কখনও কখনও এটি খোলার জন্য প্রচেষ্টা করার পক্ষে মূল্য হয় না।

অবশ্যই, এটিও সম্ভব যে গ্রন্থাগারের লেখকরা কেবল অলস ছিলেন। আপনি কোন লাইব্রেরির কথা বলছেন তার উপর নির্ভরশীল। :-)


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


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

5
@ দ্য এল কিউ: এটি একটি দুর্দান্ত ধারণা।
রবার্ট হার্ভে

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

24

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

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

সু-নকশিত লাইব্রেরিতে, উত্তরাধিকারের মাধ্যমে প্রসারিত মূল্যবান ক্লাসগুলি সুরক্ষিত এবং জনসাধারণের সদস্যদেরকে সঠিক জায়গাগুলিতে সুরক্ষিত করেছে এবং সমস্ত কিছু লুকিয়ে রেখেছে।


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

5
আলগা সংযোগের সুবিধার জন্য +1। @ দ্য এলকিউ, এটি এমন ইন্টারফেস যা আপনার উপর নির্ভরশীল হওয়া উচিত, বাস্তবায়ন নয়।
কার্ল বিলেফেল্ট

19

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

"চূড়ান্ত" শ্রদ্ধা সম্পর্কে। "সিলড" ক্লাস, একটি সাধারণ কেস অপরিবর্তনীয় ক্লাস classes কাঠামোর অনেকগুলি অংশ স্ট্রিং অপরিবর্তনীয় হওয়ার উপর নির্ভর করে। যদি স্ট্রিং ক্লাসটি চূড়ান্ত না হয় তবে এক পরিবর্তনীয় স্ট্রিং সাবক্লাস তৈরি করা সহজ (এমনকি লোভনীয়) যে অপরিবর্তনীয় স্ট্রিং ক্লাসের পরিবর্তে অন্যান্য শ্রেণিতে সমস্ত ধরণের বাগ তৈরি করে।


4
এটিই আসল উত্তর। অন্যান্য উত্তরগুলি গুরুত্বপূর্ণ বিষয়গুলিতে স্পর্শ করে তবে প্রকৃত প্রাসঙ্গিক বিটটি হ'ল: এবং যা কিছুই নয় finalএবং / বা privateজায়গায় তালাবদ্ধ রয়েছে এবং কখনই পরিবর্তন করা যাবে না
কনরাড রুডল্ফ

1
@ কনরাড: যতক্ষণ না বিকাশকারীরা সবকিছু পুনর্নির্মাণের সিদ্ধান্ত নেয় এবং অ-পিছনে-সামঞ্জস্যপূর্ণ হয়।
জাব

এটি সত্য, তবে এটি লক্ষ করা সার্থক যে এটি publicসদস্যদের চেয়ে অনেক দূর্বল প্রয়োজন ; protectedসদস্যরা কেবলমাত্র শ্রেণীর মধ্যে একটি চুক্তি গঠন করে যা তাদের এবং এটির তাত্ক্ষণিকভাবে উত্পন্ন ক্লাসকে প্রকাশ করে; বিপরীতে, publicসমস্ত সম্ভাব্য বর্তমান এবং ভবিষ্যতের উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণীর পক্ষ থেকে সমস্ত ভোক্তাদের সাথে চুক্তির জন্য সদস্যগণ।
সুপারক্যাট

14

ওওতে বিদ্যমান কোডে কার্যকারিতা যুক্ত করার জন্য দুটি উপায় রয়েছে।

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

কার্যকারিতা যুক্ত করার জন্য অন্যান্য পদ্ধতি হ'ল প্রতিনিধি বা রচনা ব্যবহার। আপনি আপনার নিজের ক্লাসটি লিখুন যা বিদ্যমান শ্রেণিকে অভ্যন্তরীণ অবজেক্ট হিসাবে ব্যবহার করে এবং বাস্তবায়ন কাজের অংশটিকে এটিতে প্রেরণ করে।

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


5
রচনা বনাম উত্তরাধিকার সহ দুর্দান্ত পয়েন্ট।
জেসল্ট টারিক

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

@ টাইলারম্যাক: আসলেই। স্কয়ার / আয়তক্ষেত্রের কেসটি আসলে এলএসপির অন্যতম পাল্টা উদাহরণ। সম্ভবত, আমার আরও কার্যকর উদাহরণের কথা চিন্তা করা উচিত।
নুড করুন

3
স্কোয়ার / আয়তক্ষেত্রটি কেবলমাত্র একটি পাল্টা নমুনা যদি আপনি পরিবর্তনের অনুমতি দেন।
স্টার ব্লু

11

উত্তরগুলির বেশিরভাগেরই এটি সঠিক: ক্লাসগুলি সিল করা উচিত (চূড়ান্ত, নোটওভারিডেবল, ইত্যাদি) যখন অবজেক্টটি ডিজাইন করা হয়নি বা প্রসারিত করার উদ্দেশ্যে করা হচ্ছে না।

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

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

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

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


ভাল যুক্তি. উত্তরাধিকার উত্তম বা খারাপ হতে পারে, সুতরাং এটি বলা ভুল যে প্রতিটি শ্রেণি সিল করা উচিত। এটি সত্যিই হাতের সমস্যার উপর নির্ভর করে।
নুড করুন

2

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

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


7
বিটিডাব্লু, ওও এবং পদ্ধতিগতভাবে সবচেয়ে জোরালোভাবে পারস্পরিক একচেটিয়া নয়। পদ্ধতি ছাড়া আপনার OO থাকতে পারে না। এছাড়াও, রচনাটি এক্সটেনশনের মতো একটি ওও ধারণা।
মাইকেল কে

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

1
এটি সমাধান করা যেতে পারে, জাভা যদি প্রথম শ্রেণির ফাংশন থাকে। সাধরণ।
মাইকেল কে

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

@ মিশেল কে: ওওপিতে প্রথম শ্রেণির ফাংশন হ'ল একটি অবজেক্টের সাথে ঠিক একটি পদ্ধতি।
জর্জিও

2

কারণ তারা আরও ভাল জানেন না।

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

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

ক্লাসগুলি সিল করা এবং কোনও সদস্যকে ব্যক্তিগতভাবে চিহ্নিত করা এই নীতিটি স্পষ্টভাবে লঙ্ঘন করে যে সহজ জিনিসগুলি সহজ হওয়া উচিত এবং কঠোর জিনিসগুলি সম্ভব হওয়া উচিত। হঠাৎ জিনিসগুলি সহজ হওয়া উচিত, তাই না।

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

  1. অহংকার - তারা সত্যই বিশ্বাস করেছিল যে তারা প্রসারের জন্য উন্মুক্ত ছিল এবং পরিবর্তনের জন্য বন্ধ ছিল
  2. প্রতিস্থাপন - তারা জানত যে অন্যান্য ব্যবহারের ক্ষেত্রেও থাকতে পারে তবে সেগুলি ব্যবহারের ক্ষেত্রে না লেখার সিদ্ধান্ত নিয়েছে

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

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

আমি পাইথনের নাম ম্যাংলিং পদ্ধতির পক্ষে অনেক বেশি পছন্দ করি। আপনার প্রয়োজনে আপনি সহজেই (প্রতিবিম্বের চেয়ে অনেক সহজ) প্রাইভেটগুলি প্রতিস্থাপন করতে পারেন। এটির উপর একটি দুর্দান্ত লিখনআপ এখানে উপলভ্য: http://bytebaker.com/2009/03/31/python-properties-vs-java-access-modifiers/

রুবির প্রাইভেট মডিফায়ারটি আসলে সি # তে সুরক্ষিত মত এবং সি # সংশোধক হিসাবে ব্যক্তিগত নেই private সুরক্ষিত কিছুটা আলাদা। এখানে দুর্দান্ত ব্যাখ্যা রয়েছে: http://www.ruby-lang.org/en/docamentation/ruby-from-other-languages/

মনে রাখবেন, আপনার অচল ভাষাকে সেই ভাষার অতীতে কোড লিখনের পুরানো শৈলীর সাথে মানিয়ে নিতে হবে না।


5
"এনক্যাপসুলেশন কখনই নিখুঁত সাফল্য প্রদর্শন করে না"। আমি ভাবতাম যে সকলেই একমত হবেন যে এনক্যাপসুলেশনের অভাব অনেক সমস্যার সৃষ্টি করেছে।
জো

5
-1। মূর্খরা সেখানে ছুটে যায় যেখানে ফেরেশতারা চালাতে ভয় পান। ব্যক্তিগত ভেরিয়েবল পরিবর্তন করার দক্ষতা উদযাপন আপনার কোডিং শৈলীতে মারাত্মক ত্রুটি দেখায়।
রিওয়ালক

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

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

1

সম্পাদনা: আমি বিশ্বাস করি ক্লাসগুলি উন্মুক্ত করার জন্য ডিজাইন করা উচিত। কিছু বিধিনিষেধ সহ, তবে উত্তরাধিকারের জন্য বন্ধ করা উচিত নয়।

কেন: "ফাইনাল ক্লাস" বা "সিল করা ক্লাস" আমার কাছে অদ্ভুত বলে মনে হচ্ছে। আমাকে নিজের ক্লাসগুলির মধ্যে কখনই "চূড়ান্ত" ("সিলড") হিসাবে চিহ্নিত করতে হবে না, কারণ আমাকে পরে এই ক্লাসগুলি অন্তর্নিহিত করতে হতে পারে।

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

কখনও কখনও, আমি কিছু স্বতঃস্ফূর্ত "সিলড" ক্লাসের সাথে ডিল করতে হয় এবং প্রদত্ত বর্গকে সংযুক্ত করে একটি নতুন শ্রেণি "র‌্যাপার" তৈরি করা শেষ করেছিলাম, যার অনুরূপ সদস্য রয়েছে।

class MyBaseWrapper {
  protected FinalClass _FinalObject;

  public virtual DoSomething()
  {
    // these method cannot be overriden,
    // its from a "final" class
    // the wrapper method can  be open and virtual:
    FinalObject.DoSomething();
  }
} // class MyBaseWrapper


class MyBaseWrapper: MyBaseWrapper {

  public override DoSomething()
  {
    // the wrapper method allows "overriding",
    // a method from a "final" class:
    DoSomethingNewBefore();
    FinalObject.DoSomething();
    DoSomethingNewAfter();
  }
} // class MyBaseWrapper

স্কোপ ক্লিটিফায়াররা উত্তরাধিকারকে সীমাবদ্ধ না করে কিছু বৈশিষ্ট্য "সিল" করতে দেয়।

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

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


-1: আপনি বলেছিলেন যে আপনি খোলার নকশা পছন্দ করেন তবে এটি প্রশ্নের উত্তর দেয় না, কারণ ক্লাসগুলি খোলার জন্য ডিজাইন করা উচিত নয়।
জো

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