'চূড়ান্ত' কীওয়ার্ডটি শিল্পে এত কম ব্যবহার করা হয় কেন? [বন্ধ]


14

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

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

যাইহোক, জেডিকে উত্স কোডটি ব্রাউজ করার সময়, আমি ক্লাস, পদ্ধতি বা ভেরিয়েবলের জন্য এই কীওয়ার্ডটির পক্ষে কখনও হোঁচট খেলাম না। একই জিনিসটি বিভিন্ন সিস্টেমে প্রযোজ্য যা আমাকে পর্যালোচনা করতে হয়েছিল।

কোন কারণ আছে? ভিতরে থেকে সবকিছু পরিবর্তন করার জন্য এটি কি সাধারণ নকশার দৃষ্টান্ত?


মাইক্রো অপ্টিমাইজেশনে, ফিল্ড finalলেখার মতো সেটিং ফিল্ডের একই শব্দার্থক থাকে volatile, এবং পরে সেগুলি পড়ার জন্য অস্থির পড়া শব্দার্থক পড়া দরকার, আপনি যা চান তা সবসময় নয়
ratchet freak

5
@ র্যাচেট: আমি মনে করি এটি আপনার ক্লাসগুলি অপরিবর্তনীয় করে তোলার বিষয়ে আরও বেশি, যেমন কার্যকরী প্রোগ্রামিংয়ের মতো।
জোনাস

@ কুয়েবল: সম্ভবত আরও গুরুত্বপূর্ণ বিষয়, পৃথক স্ট্রিংয়ের উদাহরণগুলি অপরিবর্তনীয়।
ম্যাট্রিক্সফ্রোগ

উত্তর:


9

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

কয়েকটি ভাল ওপেন সোর্স প্রকল্পগুলি একবার দেখার চেষ্টা করুন এবং আমি মনে করি আপনি আরও খুঁজে পাবেন।

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


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

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

1
আমি মনে করি এটি এক্সটেনশন এড়িয়ে যাওয়ার চেয়ে অপরিবর্তনীয়তা সম্পর্কে আরও বেশি। অন্য কথায় finalক্ষেত্রগুলিতে এবং পদ্ধতিগুলিতে নয়। অপরিষ্কার ক্লাসগুলিও প্রসারিত করার জন্য ডিজাইন করা যেতে পারে।
জোনাস

15

ব্যবহার করে সমস্যা finalযে কিছু পঠনযোগ্য বোঝাতে এটা শুধুমাত্র সত্যিই আদিম ধরনের পছন্দ জন্য কাজ করে যে int, charইত্যাদি সমস্ত Java বস্তু আসলে একটি (ধরনের) পয়েন্টার ব্যবহার করে উল্লেখ করা হয়। ফলস্বরূপ, আপনি যখন finalকোনও বস্তুর কীওয়ার্ডটি ব্যবহার করেন , আপনি কেবল বলছেন যে রেফারেন্স কেবল পঠনযোগ্য, অবজেক্টটি নিজেই এখনও পরিবর্তনযোগ্য।

এটি যদি কেবলমাত্র বস্তুটিকে কেবল পঠনযোগ্য করে তোলে তবে এটি আরও বেশি ব্যবহৃত হত। সি ++ এ ঠিক constএটিই ঘটে এবং ফলস্বরূপ এটি অনেক বেশি দরকারী এবং ভারী ব্যবহৃত কীওয়ার্ড।

আমি finalকীওয়ার্ডটি ভারীভাবে ব্যবহার করি এমন একটি জায়গা প্যারামিটার সহ এই জাতীয় জিনিসগুলির দ্বারা তৈরি হওয়া কোনও বিভ্রান্তি এড়ানোর জন্য:

public void someMethod(FancyObject myObject) {
    myObject = new FancyObject();
    myObject.setProperty(7);
}
...
public static void main(final String[] args) {
    ...
    FancyObject myObject = new FancyObject();
    someOtherObject.someMethod(myObject);
    myObject.getProperty(); // Not 7!
}

এই উদাহরণে এটি সুস্পষ্ট বলে মনে হচ্ছে কেন এটি কাজ করে না তবে যদি someMethod(FancyObject)বড় এবং জটিল বিভ্রান্তি দেখা দেয়। কেন এড়াবেন না?

কোডিং স্ট্যান্ডার্ডগুলিও এটি সূর্যের (বা ওরাকল এখন আমি অনুমান করি) অংশ।


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

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

মনে রাখবেন এমন কিছু সময় আছে যখন আপনি প্যারামিটারটি পুনরায় নিয়োগ করতে চান। যেমন একটি স্ট্রিং প্যারামিটার ছাঁটাই হয়।
স্টিভ কুও

@ স্টিভ আমি সেই পরিস্থিতিতে নিযুক্ত হওয়ার জন্য একটি নতুন পরিবর্তনশীল তৈরি করি।
জ্ঞান ওরফে গ্যারি বুয়েন

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

4

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

অন্যান্য বেশ কয়েকটি ভাষা যেমন Scala হিসেবে, এটা অনেক সহজ চূড়ান্ত ঘোষণা (জন্য না Val )। এই ভাষাগুলিতে চূড়ান্ত ঘোষণাগুলি ভেরিয়েবলের চেয়ে বেশি সাধারণ হতে পারে।

মনে রাখবেন চূড়ান্ত কীওয়ার্ডের বিভিন্ন ব্যবহার রয়েছে। আপনার পোস্টটি বেশিরভাগই 2 এবং 3 আইটেমগুলি কভার করে।

  1. চূড়ান্ত শ্রেণি (জেএলএস 8.1.1.2)
  2. চূড়ান্ত ক্ষেত্রগুলি (জেএলএস 8.3.1.2)
  3. চূড়ান্ত পদ্ধতি (জেএলএস 8.4.3.3)
  4. চূড়ান্ত চলক (জেএলএস 4.12.4)

2

ঠিক আছে, সরকারী জাভা কোড কনভেনশনগুলি বিশেষভাবে ব্যবহারের পক্ষে বা নিষেধও করে না final। এটি হল, জেডিকে বিকাশকারীরা তাদের পছন্দের উপায়টি বেছে নিতে নির্দ্বিধায়।

আমি তাদের মন পড়তে পারি না তবে আমার কাছে, ব্যবহার করা উচিত finalবা না করা উচিত তা বিবেচনার বিষয় হয়ে দাঁড়িয়েছে । কোডটিতে পুঙ্খানুপুঙ্খভাবে মনোনিবেশ করার জন্য আমার যথেষ্ট সময় আছে কিনা তা একটি বিষয় ।

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

এটি জেআইটিকে সামান্য উত্সাহ প্রদান করতে পারে এবং এটি খুব সীমাবদ্ধ হলেও ক্ষতি করতে পারে না

উপরের মত যুক্তি পিচ্ছিল হয়। অকাল অপ্টিমাইজেশন ক্ষতি করতে পারে; ডোনাল্ড নুথ এটিকে "সমস্ত মন্দের মূল" হিসাবে অভিহিত করেছেন । এটি আপনাকে আটকাতে দেবেন না। বোবা কোড লিখুন


2

Eclipse IDE এ সম্প্রতি আমি "ক্রিয়াকলাপগুলি সংরক্ষণ করুন" বৈশিষ্ট্যের আনন্দ আবিষ্কার করেছি। আমি এটিকে আমার কোডটি পুনরায় ফর্ম্যাট করতে, অনুপস্থিত @Overrideটীকাগুলি সন্নিবেশ করানোর জন্য এবং কিছু নিফটি স্টাফ করতে পারি যেমন অভিব্যক্তিগুলিতে অপ্রয়োজনীয় প্রথম বন্ধনী মুছে ফেলতে বা finalপ্রতিবার আমি যখনই আঘাত করি তখন স্বয়ংক্রিয়ভাবে যেকোন জায়গায় কীওয়ার্ড লাগাতে পারি ctrl + S। আমি সেই কয়েকটি ট্রিগার সক্রিয় করেছি এবং, ছেলে, এটি অনেক সাহায্য করে!

দেখা গেল যে এই ট্রিগারগুলির মধ্যে অনেকেই আমার কোডের জন্য দ্রুত তাত্পর্যপূর্ণ পরীক্ষা করার মতো কাজ করে।

  • আমি কোনও পদ্ধতিকে ওভাররাইড করার ইচ্ছা করেছি কিন্তু আঘাত করার সময় টীকাটি প্রদর্শিত হয়নি ctrl + s? - সম্ভবত আমি কোথাও প্যারামিটারের প্রকারভেদ করেছি!
  • কিছু বন্ধনী সংরক্ষণের কোড থেকে সরানো হয়েছে? - সম্ভবত সেই যুক্তি প্রকাশটি কোনও প্রোগ্রামারের পক্ষে দ্রুত ঘুরে বেড়ানো পক্ষে খুব কঠিন। অন্যথায়, আমি কেন এই প্রথম বন্ধনী যুক্ত করব?
  • সেই প্যারামিটার বা স্থানীয় পরিবর্তনশীল নয় final। এটা আছে আছে এর মান পরিবর্তন করবেন?

এটি প্রমাণিত হয়েছে যে কম ভেরিয়েবলগুলি ডিবাগ করার সময় আমার যত কম সমস্যা হয় তা পরিবর্তন করে। আপনি কতবার কিছু পরিবর্তনশীলের মান অনুসরণ করছেন কেবল এটির জন্য যে এটি কোনওভাবে 5 থেকে 7 বলে? "এ কেমন হতে পারে ?!" আপনি নিজেকে জিজ্ঞাসা করেন এবং আপনি নিজের যুক্তিতে কোনও ভুল করেছেন তা খুঁজে বের করার জন্য অগণিত পদ্ধতিতে আগত এবং কয়েক ঘন্টা সময় ব্যয় করেন। এবং এটি ঠিক করার জন্য আপনাকে আরও একটি পতাকা যুক্ত করতে হবে, কয়েকটি শর্ত এবং সাবধানে কিছু মান এখানে এবং সেখানে পরিবর্তন করতে হবে।

ওহ, আমি ডিবাগিং ঘৃণা করি! প্রতিবার আমি ডিবাগার আমি আমার সময় মত মনে রান আউট চলমান এবং আমি নিদারুণভাবে সেই সময় অন্তত করতে হবে কিছু আমার শৈশব স্বপ্ন সত্য পরিণত! ডিবাগিংয়ের সাথে নরক! finalএর অর্থ আর রহস্যজনক মানের কোনও পরিবর্তন নেই। finalআমার কোডে আরও s => কম ঝাঁঝরি অংশ => কম বাগ => ভাল জিনিস করার জন্য আরও সময়!

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


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


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

1
হ্যাঁ, আমি এটি জানি এবং আমি সময়ে সময়ে কিছু এমএল কোড লিখি - সেখান থেকেই আমি আমার অনুপ্রেরণা পেয়েছি :) এটি আপনি যে ভাষা ব্যবহার করেন তা নয় বরং আপনি যে নীতি এবং কৌশল প্রয়োগ করেন সে সম্পর্কে। এক Haskell, এবং সঙ্গে সব অনুজ্ঞাসূচক যেতে পারেন doস্বরলিপি :) নিশ্চিত, জাভা কার্মিক শৈলী লেখা কিন্তু অন্তত আপনার শক্তসমর্থ কোড -আর লিখতে পারবেন জন্য শ্রেষ্ঠ ভাষা নয় যে একটা কাজ যা আমি যত্নশীল।
অ্যান্ড্রু Листочкин Листочкин
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.