বিশ্বব্যাপী .NET এর সমস্ত শ্রেণি কেন অবজেক্ট ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত?


16

এটি আমার জন্য অত্যন্ত আকর্ষণীয় যা সুবিধাগুলি কাঠামোর জন্য "গ্লোবাল রুট ক্লাস" পদ্ধতির দেয়। সাধারণ কথায় কী কারণগুলির কারণে .NET ফ্রেমওয়ার্কটি একটি কার্যকারিতা সমস্ত শ্রেণীর জন্য উপযুক্ত একটি রুট অবজেক্ট শ্রেণি নকশা করা হয়েছিল ।

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

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

সুতরাং, আমি কারণগুলি কী কারণে প্রকৃতপক্ষে চাপ দেয় তা জানতে আগ্রহী N নেট আর্কিটেক্টরা এইভাবে ফ্রেমওয়ার্ক ডিজাইন করতে।


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

10
"কারণগুলি কী কারণে প্রকৃতপক্ষে চাপ দেয় তা জানতে আমি খুব আকর্ষণীয় N এর জন্য তিনটি খুব ভাল কারণ রয়েছে: ১. জাভা সেভাবে এটি করেছিল, ২. জাভা সেভাবে এটি করেছিল, এবং ৩. জাভা সেভাবে এটি করেছিল।
ডেসব্লিংকনলাইট

2
@vcsjones: এবং জাভা উদাহরণস্বরূপ wait()/ notify()/ notifyAll()এবং এর সাথে ইতিমধ্যে দূষিত clone()
জোছিম সউর

3
নিবন্ধন করুন জাভা এটি সেভাবে করেনি।
দান্তে

2
@ ড্যাসব্লিংকনলাইট: এফওয়াইআই, জাভা হ'ল লম্বাডাস, লিনকিউ ফাংশন, ইত্যাদি সহ বর্তমানে সি # অনুলিপি করছে ...
ব্যবহারকারীর 411686

উত্তর:


18

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


6
এটি সঠিক উত্তর। জেনেরিক সহায়তার অভাবই একমাত্র কারণ ছিল। অন্যান্য "সাধারণ-পদ্ধতি" যুক্তিগুলি আসল যুক্তি নয় কারণ সাধারণ পদ্ধতিগুলির সাধারণ হওয়ার প্রয়োজন নেই - উদাহরণ: 1) টোস্ট্রিং: বেশিরভাগ ক্ষেত্রেই আপত্তিজনক আচরণ করা হয়; 2) গেটহ্যাশকোড: প্রোগ্রামটি কি করে তার উপর নির্ভর করে, বেশিরভাগ শ্রেণীর এই পদ্ধতির প্রয়োজন হয় না; 3) গেটটাইপ: কোনও উদাহরণ পদ্ধতি হতে হবে না
কোডিজম

2
কীভাবে সমস্ত কিছু নির্দিষ্ট বর্গের উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া উচিত এই ধারণাটি "আপত্তিজনক" করে নেট নেট "সমস্ত ধরণের সুরক্ষা পুরোপুরি হারাবে"? আশেপাশে এমন কোন শিটকোড লেখা Objectযেতে পারে যা void *সি ++ এ প্রায় লেখা যায় না?
কারসন 63000

3
কে বলেছিল যে আমি ভেবেছিলাম void*আরও ভাল ছিল? এটা না। যদি কিছু হয়। এটা আরও খারাপ
ডেডএমজি

void*সমস্ত অন্তর্নিহিত পয়েন্টার কাস্টের সাথে সিতে আরও খারাপ, তবে সি ++ এই ক্ষেত্রে আরও কঠোর। কমপক্ষে আপনাকে স্পষ্টতই কাস্ট করতে হবে।
ট্যামস সেজেলি

2
@ ফিশ: একটি পরিভাষা কোবল: সি-তে, "অন্তর্নিহিত .ালাই" বলে কিছুই নেই। একটি কাস্ট একটি স্পষ্টতাল অপারেটর যা কোনও রূপান্তর নির্দিষ্ট করে। আপনার অর্থ "অন্তর্ভুক্ত পয়েন্টার রূপান্তর " "
কিথ থম্পসন

11

আমার মনে আছে এরিক লিপার্ট একবার বলেছিলেন যে System.Objectক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া 'গ্রাহকের জন্য সর্বোত্তম মূল্য' সরবরাহ করে। [সম্পাদনা: হ্যাঁ, তিনি এটি এখানে বলেছেন ]:

... তারা না প্রয়োজন একটি সাধারণ বেস প্রকার। এই পছন্দটি প্রয়োজনীয়তার বাইরে করা হয়নি। এটি গ্রাহকের জন্য সর্বোত্তম মান প্রদানের আকাঙ্ক্ষার ফলে তৈরি হয়েছিল।

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

এটি একটি সুন্দর অস্পষ্ট উত্তর। আপনি যদি আরও নির্দিষ্ট উত্তর চান তবে আরও নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করার চেষ্টা করুন try

System.Objectশ্রেণি থেকে প্রাপ্ত সমস্ত কিছু নির্ভরযোগ্যতা এবং উপযোগিতা সরবরাহ করে যা আমি প্রচুর সম্মান করতে এসেছি। আমি জানি যে সমস্ত বস্তুর একটি প্রকার ( GetType) থাকবে, তারা সিএলআর-এর চূড়ান্তকরণ পদ্ধতিগুলির সাথে সামঞ্জস্য থাকবে ( Finalize), এবং GetHashCodeসংগ্রহগুলি নিয়ে কাজ করার সময় আমি সেগুলি ব্যবহার করতে পারি ।


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

5
না, এটা ত্রুটিপূর্ণ না - আমি কখনো বলেননি যে আপনার ব্যবহার করেন GetType, Finalizeবা, GetHashCodeযে জন্য System.Object। আমি কেবল বলেছি যে তারা চাইলে তারা সেখানে ছিল। "তাদের ইন্টারফেস অপ্রয়োজনীয়ভাবে দূষিত" হিসাবে, আমি আমার মূল এলিপিটের উদ্ধৃতিটি উল্লেখ করব: "গ্রাহকের জন্য সর্বোত্তম মান"। স্পষ্টতই .NET টিম ট্রেড অফগুলি মোকাবেলা করতে রাজি ছিল।
gws2

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

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

এই প্রশ্নের উত্তর হতে খুব অস্পষ্ট।
ডেড এমজি

4

আমি মনে করি জাভা এবং সি # ডিজাইনাররা একটি মূল অবজেক্ট যুক্ত করেছিলেন কারণ এটি তাদের জন্য মূলত বিনামূল্যে ছিল, বিনামূল্যে মধ্যাহ্নভোজনের মতো

রুট অবজেক্ট যুক্ত করার ব্যয় আপনার প্রথম ভার্চুয়াল ফাংশন যুক্ত করার ব্যয়ের সাথে অনেক সমান। যেহেতু সিএলআর এবং জেভিএম উভয়ই বস্তু চূড়ান্তকারীগুলির সাথে আবর্জনা সংগ্রহ করা পরিবেশ, তাই আপনার java.lang.Object.finalizeবা আপনার System.Object.Finalizeপদ্ধতির জন্য আপনার কমপক্ষে একটি ভার্চুয়াল থাকা দরকার । অতএব, আপনার মূল অবজেক্টটি যুক্ত করার জন্য ইতিমধ্যে প্রিপেইড রয়েছে, আপনি এটির জন্য অর্থ প্রদান না করেই সমস্ত সুবিধা পেতে পারেন। এটি উভয় বিশ্বের সেরা: যে ব্যবহারকারীদের একটি সাধারণ মূল শ্রেণীর প্রয়োজন তারা যা চান তা পেয়ে যেত, এবং যে ব্যবহারকারীরা কম যত্ন নিতে পারেন না তারা এমনভাবে প্রোগ্রাম করতে সক্ষম হলেন যেন এটি নেই।


4

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

.NET এর সাধারণ শেকড় নেই কেন?

সবচেয়ে প্রযুক্তিগত দিক থেকে, প্রতিফলনের জন্য এবং প্রাক-জেনেরিক ধারকগুলির জন্য একটি সাধারণ মূল থাকা অপরিহার্য

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

একটি ভাষায় একটি সাধারণ মূল থাকার সুবিধা এবং অসুবিধাগুলি কী কী?

একটি সাধারণ মূল থাকার সুবিধা:

  • আপনি অনুমতি দিতে পারেন সব বস্তু আপনি যেমন, গুরুত্বপূর্ণ বিবেচনা একটি নির্দিষ্ট কার্যকারিতা আছে equals()এবং hashCode()। তার অর্থ, উদাহরণস্বরূপ, জাভা বা সি # তে থাকা প্রতিটি বস্তু হ্যাশ মানচিত্রে ব্যবহার করা যেতে পারে - সেই পরিস্থিতিটি সি ++ এর সাথে তুলনা করুন।
  • আপনি অজানা প্রকারের অবজেক্টগুলিকে উল্লেখ করতে পারেন - উদাহরণস্বরূপ যদি আপনি কেবল জেনেরিক পাত্রে প্রাক-জেনেরিক ধারকগুলি যেমন তথ্য স্থানান্তরিত করেন তবে around
  • আপনি অজান্তে টাইপের অবজেক্টগুলিকে উল্লেখ করতে পারেন - যেমন প্রতিবিম্বটি ব্যবহার করার সময়।
  • এটি বিরল ক্ষেত্রে ব্যবহার করা যেতে পারে যখন আপনি কোনও অবজেক্ট গ্রহণ করতে সক্ষম হতে চান যা বিভিন্ন এবং অন্যথায় সম্পর্কিত সম্পর্কযুক্ত হতে পারে - উদাহরণস্বরূপ কোনও- printfমত পদ্ধতির প্যারামিটার হিসাবে ।
  • এটি আপনাকে কেবল একটি শ্রেণিতে পরিবর্তন করে সমস্ত বস্তুর আচরণ পরিবর্তন করার নমনীয়তা দেয়। উদাহরণস্বরূপ, আপনি যদি আপনার সি # প্রোগ্রামের সমস্ত অবজেক্টে কোনও পদ্ধতি যুক্ত করতে চান তবে আপনি এতে একটি এক্সটেনশন পদ্ধতি যুক্ত করতে পারেন object। খুব সাধারণ নয়, সম্ভবত, তবে একটি সাধারণ মূল ছাড়া এটি সম্ভব হবে না।

একটি সাধারণ মূল থাকার অসুবিধা:

  • আপনি যদি এর জন্য আরও সঠিক ধরণের ব্যবহার করতে পারতেন তবে কিছু মানের কোনও অবজেক্টের উল্লেখ করতে এটি আপত্তিজনক ব্যবহার করা যেতে পারে।

আপনার কাঠামোর প্রকল্পে আপনার কি সাধারণ রুট নিয়ে যেতে হবে?

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

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

অবশ্যই, প্রকারগুলি এর জন্য কমপক্ষে সামান্য সম্পর্কিত হতে হবে এবং বিশেষত, আমি কেবলমাত্র একটি সাধারণ মূল পেতে "আইস-এ" বিধিটিকে ত্যাগ করি না।


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

3

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

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

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

তবে তা ঘটে। যদি তা হয়ে থাকে, তবে সেই সাধারণ আচরণকে বিমূর্ত করার জন্য ঠিক এগিয়ে যান।


2

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

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


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

2

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

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

আমি আপনাকে আগ্রহী জিজ্ঞাসা করি আপনি যে কাঠামোটি লিখছেন তার সম্ভাব্য সমস্ত শ্রেণীর কাছে আপনাকে কী কার্যকারিতাটি প্রকাশ করতে হবে। এটি কি সত্যই সমস্ত বস্তু দ্বারা ব্যবহৃত হবে? নাকি তাদের বেশিরভাগের দ্বারা? এবং একবার আপনি মূল শ্রেণি তৈরি করার পরে, আপনি কীভাবে লোককে এলোমেলো কার্যকারিতা যুক্ত করা থেকে বিরত রাখবেন? বা এলোমেলো পরিবর্তনশীল তারা "গ্লোবাল" হতে চান?

বেশ কয়েক বছর আগে খুব বড় অ্যাপ্লিকেশন ছিল যেখানে আমি একটি রুট ক্লাস তৈরি করেছিলাম। কয়েক মাস বিকাশের পরে এটিকে কোড দ্বারা জনপ্রিয় করা হয়েছিল যার কোনও ব্যবসা নেই no আমরা একটি পুরানো এএসপি অ্যাপ্লিকেশন রূপান্তর করছিলাম এবং রুট ক্লাসটি ছিল আমরা অতীতে ব্যবহৃত পুরানো গ্লোবাল.আইএন ফাইলের প্রতিস্থাপন। সেই পাঠটি কঠিনভাবে শিখতে হয়েছিল।


2

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

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

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

এগুলি সবই গুরুত্বপূর্ণ কারণ মান ধরণের হিপ অবজেক্টের উল্লেখগুলি শ্রেণীর রেফারেন্সগুলির মতো আচরণ করে না মান মানের মতো like উদাহরণস্বরূপ, নিম্নলিখিত কোডটি বিবেচনা করুন:

স্ট্রিং টেস্টমিশ্রণকারী <টি> (টি এটি) যেখানে টি: আইনিউমেটর <স্ট্রিং>
{
  var it2 = it;
  it.MoveNext ();
  it2.MoveNext ();
  এটি ফেরত দিন। বর্তমান;
}
পাবলিক শূন্য পরীক্ষা ()
{
  var theList = নতুন তালিকা <স্ট্রিং> ();
  theList.Add ( "ফ্রেড");
  theList.Add ( "জর্জ");
  theList.Add ( "পার্সি");
  theList.Add ( "মলি");
  theList.Add ( "রন");

  var enum1 = theList.GetEnumerator ();
  আইনিউমেটর <স্ট্রিং> এনুম 2 = এনাম 1;

  Debug.Print (testEnumerator (enum1));
  Debug.Print (testEnumerator (enum1));
  Debug.Print (testEnumerator (enum2));
  Debug.Print (testEnumerator (enum2));
}

যদি testEnumerator()পদ্ধতিটি মান ধরণের স্টোরেজ অবস্থানটি পাস করা হয় তবে itএকটি উদাহরণ পাবেন যার সরকারী এবং ব্যক্তিগত ক্ষেত্রগুলি উত্তীর্ণিত মান থেকে অনুলিপি করা হয়েছে। স্থানীয় ভেরিয়েবল it2আরও একটি উদাহরণ ধারণ করবে যার ক্ষেত্রগুলি সমস্ত থেকে অনুলিপি করা হয়েছে it। কল MoveNextকরা it2কোনও প্রভাব ফেলবে না it

উপরের কোডটি যদি শ্রেণীর ধরণের স্টোরেজ অবস্থানটি পাস করা হয় তবে উত্তীর্ণের মান it, এবং it2, সমস্ত একই বস্তুর উল্লেখ করবে এবং এইভাবে MoveNext()তাদের যে কোনওটিতে কল করলে তাদের সকলকে কার্যকরভাবে এটি কল করা হবে।

লক্ষ্য করুন ভোটদান List<String>.Enumeratorথেকে IEnumerator<String>কার্যকরভাবে একটি বর্গ টাইপ একটি মান টাইপ থেকে এটা সক্রিয়। হিপ অবজেক্টের ধরণ List<String>.Enumeratorতবে এর আচরণ একই নামের মান প্রকারের থেকে খুব আলাদা হবে।


ToString () উল্লেখ না জন্য +1
JeffO

1
এটি বাস্তবায়নের বিশদ সম্পর্কে সমস্ত। এগুলি ব্যবহারকারীর সামনে প্রকাশ করার দরকার নেই।
ডেডএমজি

@ ডেড এমএমজি: আপনার অর্থ কী? List<T>.Enumeratorযেটির হিসাবে সংরক্ষণ করা হয় তার পর্যবেক্ষণযোগ্য আচরণটি একটি যা সংরক্ষণ করা হয় List<T>.Enumeratorতার আচরণের তুলনায় উল্লেখযোগ্যভাবে পৃথক, যেটিতে IEnumerator<T>পূর্বের ধরণের একটি মান কোনও স্টোরের স্টোরেজ স্থানে সংরক্ষণ করা হলে সেই তালিকাটির অনুলিপি তৈরি করবে, পরে কোনও ধরণের স্টোরেজ লোকেশনে কোনও স্টোরের স্থানে সংরক্ষণ করার পরে এটি কোনও অনুলিপি তৈরি করবে না।
সুপারক্যাট

হ্যাঁ, তবে Objectসত্যটির সাথে কিছু করার নেই
ডেডএমজি

@ ডেড এমজি: আমার বক্তব্যটি হ'ল ধরণের একটি apগল উদাহরণও System.Int32একটি উদাহরণ System.Object, তবে ধরণের স্টোরেজ অবস্থানের System.Int32কোনও System.Objectউদাহরণ বা একটির উল্লেখ নেই।
সুপারক্যাট

2

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

মূলটিতে Object(বা অনুরূপ কিছু) দিয়ে একটি একক শ্রেণিবিন্যাস থাকা আপনার সংগ্রহের শ্রেণিগুলি সংগ্রহ হিসাবে সংগ্রহ করা মোটামুটি সহজ (উদাহরণস্বরূপ) তৈরি করে Object, সুতরাং কোনও সংকলনের জন্য কোনও ধরণের অবজেক্ট ধারণ করা তুচ্ছ।

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

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

যখন জাভা (এবং কিছুটা কম পরিমাণে .NET) ডিজাইন করা হয়েছিল, তখন একরঙা শ্রেণীর শ্রেণিবিন্যাস সম্ভবত সম্ভবত একটি "নিরাপদ" পছন্দ হিসাবে দেখা হত - সমস্যাযুক্ত একটি, তবে বেশিরভাগই ज्ञात সমস্যা ছিল। জেনেরিক প্রোগ্রামিং, এর বিপরীতে, প্রায় সবাই (তবুও) বুঝতে পেরেছিল যে সমস্যাটির প্রতি তাত্ত্বিকভাবে অনেক ভাল পদ্ধতির ধারণা ছিল, তবে অনেকগুলি বাণিজ্যিক ভিত্তিক বিকাশকারীরা বরং দুর্বল অন্বেষণকৃত এবং / বা ঝুঁকিপূর্ণ হিসাবে বিবেচিত (অর্থাত্ বাণিজ্যিক বিশ্বে) , অ্যাডাকে ব্যর্থতা হিসাবে বহুলাংশে বরখাস্ত করা হয়েছিল)।

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

আজ একটি নতুন ডিজাইনের জন্য, তবে এর কোন যুক্তিসঙ্গত প্রশ্ন নেই: একচেটিয়া শ্রেণিবিন্যাস ব্যবহার করা একটি স্পষ্ট ভুল এবং একটি খারাপ ধারণা।


এটি বলার অপেক্ষা রাখে না যে টেমপ্লেটগুলি .NET শিপিয়ে দেওয়ার আগে দুর্দান্ত এবং দরকারী হিসাবে পরিচিত ছিল।
ডেডএমজি

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

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

@ জেরি: আমি মনে করি সি ++ টেমপ্লেটগুলি অ্যাডা জেনারিকের ধারণাগুলি গ্রহণ করেছে, তারপরে অন্তর্নিহিত তাত্ক্ষণিকতায় এগুলি ব্যাপকভাবে উন্নত করেছে।
কেভিন ক্লাইন

1

আপনি যা করতে চান তা আসলে আকর্ষণীয়, আপনার কাজ শেষ না হওয়া পর্যন্ত এটি ভুল বা সঠিক কিনা তা প্রমাণ করা শক্ত।

এখানে ভাবার মতো কিছু বিষয় রয়েছে:

  • আপনি কখন ইচ্ছাকৃতভাবে এই নির্দিষ্ট-স্তরের অবজেক্টটিকে একটি নির্দিষ্ট নির্দিষ্ট বস্তুর উপরে দিয়ে যাবেন?
  • আপনার ক্লাসের প্রতিটি একক মধ্যে আপনি কি কোড স্থাপন করতে চান?

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

এছাড়াও, ব্যক্তিগত অভিজ্ঞতা থেকে:

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

লাইব্রেরিটি ব্যবহার করা আমার পক্ষে সবচেয়ে কঠিন ছিল যা আমি কখনও মোকাবিলা করেছি।


0

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

এমনকি ওরাকলও এ জাতীয় বেস ধরণের থাকার বিষয়টি উপলব্ধি করেছে এবং 2017 এর নিকটে জাভাতে আদিমদের অপসারণের পরিকল্পনা করছে


6
এটি ওওপির উপায় নয় বা গুরুত্বপূর্ণও নয়। আপনি "এটি ভাল" ব্যতীত কোনও আসল যুক্তি দেন না।
ডেডএমজি

1
@ ডেড এমজি আপনি প্রথম বাক্যটির অতীতের যুক্তিগুলি পড়তে পারেন। আদিম পদার্থগুলির চেয়ে পৃথকভাবে আচরণ করে প্রোগ্রামারকে অবজেক্ট এবং আদিমতার জন্য একই উদ্দেশ্য কোডের অনেকগুলি রচনা লিখতে বাধ্য করে।
দান্তে

2
@ ডেড এমজি ভালভাবে বলেছেন তিনি এর অর্থ আপনি ধরে নিতে পারেন ToString()এবং GetType()প্রতিটি বিষয়ে থাকবেন। এটি সম্ভবত উল্লেখ করার মতো যে আপনি objectকোনও .NET অবজেক্ট সংরক্ষণের জন্য টাইপের একটি ভেরিয়েবল ব্যবহার করতে পারেন ।
জন

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

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