স্কেল সংকলক কেন ননসিল করা ক্লাস / বৈশিষ্ট্যগুলির জন্য প্যাটার্ন মিলের সতর্কতা দিতে পারে না?


10

আমি যদি একটি আন সিল traitবা abstract classস্কালায় ব্যবহার করি এবং তারপরে প্যাটার্ন ম্যাচিং ব্যবহার করি, আমি অবাক হই, এই নির্দিষ্ট প্যাটার্নম্যাচটির জন্য সংকলকটি কি সংকলন সময়ে জানেন না যে এই বৈশিষ্ট্য / শ্রেণীর সম্ভাব্য প্রয়োগগুলি কীভাবে উপলব্ধ? সুতরাং, যদি তা হয়, তবে কী সম্ভাব্য সমস্ত নির্ভরতা / আমদানি যাচাই করে কোন ধরণের ব্যবহার করা যেতে পারে তা তিনি জানেন বলে trait/ abstract classসিল করা না হলেও প্যাটার্ন ম্যাচের সতর্কতাগুলি দিতে পারে না ?

উদাহরণস্বরূপ, যদি আমার একটি থাকে Option[A]এবং আমি কেবল প্যাটার্ন ম্যাচিং করি তবে এটির জন্য Some[A]নয় None, সংকলকটি অভিযোগ করবে, কারণ Optionসিল করা আছে।

সংকলক যদি তা জানতে / সমাধান করতে না পারে তবে সে কেন পারবে না? এবং যদি সংকলক (তাত্ত্বিকভাবে) এটি করতে পারে তবে এটি স্কালায় ব্যবহৃত না হওয়ার কারণগুলি কী? অন্য ভাষা আছে যা এই ধরণের আচরণকে সমর্থন করে?


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

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

@ কেডিগ্রিগরি হ্যাঁ, আপনি এটি পেয়েছেন। এটি আরও স্পষ্ট করার জন্য আমি একটি উদাহরণ যুক্ত করেছি।
ভ্যালেনটারি

3
সমস্ত আমদানি চেক করা সমস্ত সম্ভাব্য সাবক্লাসগুলি আবিষ্কার করার জন্য যথেষ্ট নয়। আর একটি সাবক্লাস পৃথক শ্রেণীর ফাইল হিসাবে ঘোষিত হতে পারে যা পরে রানটাইমের মাধ্যমে লোড করা হয় java.lang.ClassLoader
আমন

উত্তর:


17

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

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

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

দ্রষ্টব্য: এগুলি কেবলমাত্র স্কালের মধ্যেই প্রযোজ্য। জেভিএমের কোনও ধারণা নেই sealed, সুতরাং অন্য জেভিএম ভাষা sealedথেকে সাবক্লাস ক্লাস করা পুরোপুরি সম্ভব , কারণ এটি অন্য ভাষায় যোগাযোগ করার কোনও উপায় নেই no সম্পত্তিতে নথিভুক্ত করা হয় টীকা, কিন্তু অন্যান্য ভাষায় 'কম্পাইলার একাউন্টে ঐ টীকা নিতে না অবশ্যই।sealedScalaSig


3

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

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


1
It can be done (at least for all classes known at compile time), it's just expensive.তবে প্রোগ্রামটি যদি 100% স্ব-অন্তর্ভুক্ত না হয় (যেমন এটি বাহ্যিক .jarফাইলগুলির উপর নির্ভর করে ), তবে আপনি কোনও এস এর মাধ্যমে সংকলন করার পরে কোনও নতুন উপক্লাসে ঝাঁকুনি করতে পারবেন না jar? সুতরাং সংকলক আপনাকে বলতে পারে "আপনার প্যাটার্নের ম্যাচগুলি এখন পুরোপুরি বিস্মৃত, তবে আপনার নির্ভরতাগুলির কোনও পরিবর্তন হলে এটি পরিবর্তিত হতে পারে" যা বাহ্যিক নির্ভরতা থাকার বিন্দুটি পুনরায় সংশোধন না করে আপডেট করতে সক্ষম হওয়ায় এটি বেশ মূল্যহীন!
ডোভাল

তাই দাবি অস্বীকার। অনুশীলনে, আপনার যদি নির্ভরতার বাইরে, বাহ্যিক বা অন্যথায় নির্ভরযোগ্য ম্যাচের প্রয়োজনের জন্য দৃ tight়ভাবে সংযুক্ত হয়ে থাকেন তবে আপনি যেভাবেই পুনরায় সংযোগ করতে চান want
কার্ল বিলেফেল্ড

@ ডোভাল তারপরে আপনার কিছুটা প্রতিনিধিদল ব্যবহার করা উচিত এবং ক্লাসটিকে বলা হচ্ছে কী করা উচিত এবং সিদ্ধান্তটিকে উল্টে দিন decide এটিই ওওপি-র জন্য বোঝানো হয়েছিল। আপনি যদি তা না চান তবে আপনার বর্তমান সমস্যা আছে।
টানা স্লেজগাড়ির

@ আর্টবি এটির সাথে প্রতিনিধি দল বা নিয়ন্ত্রণের বিপরীতের কী সম্পর্ক রয়েছে তা আমি দেখতে ব্যর্থ।
ডোভাল

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