1. সিনট্যাকটিক চিনি

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

একটি চটকদার ভাষা বৈশিষ্ট্য যা আপনাকে একটি শর্টকাট নিতে দেয় (কম কোড লিখতে) সিনট্যাকটিক চিনি বলা হয় । কিন্তু, সত্যি বলতে, জাভাতে এর খুব কমই আছে।

জাভার স্রষ্টারা জাভাতে যেকোন অপ্রয়োজনীয়তা দূর করার জন্য যথাসাধ্য করেছেন। যদি C++ আপনাকে 20 উপায়ে কিছু করতে দেয়, তাহলে জাভা আপনাকে এটি শুধুমাত্র একটি উপায় করতে দেয়।

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

যাইহোক, আপনি ইতিমধ্যে কিছু সিনট্যাটিক চিনির সম্মুখীন হয়েছেন: অটোবক্সিং এবং আনবক্সিং । আসুন তুলনা করা যাক:

দীর্ঘ কোড কমপ্যাক্ট কোড
Integer a = new Integer(5);
int b = a.intValue();
Integer a = 5;
int b = a;
int b = 5;
Integer c = new Integer(b);
int b = 5;
Integer c = b;
Integer a = new Integer(1);
int b = 1;
if (a.intValue() == b)
{
   ...
}
Integer a = 1;
int b = 1;
if (a == b)
{
   ...
}

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


2. একটি ভেরিয়েবলের প্রকারের অনুমান: varকীওয়ার্ড

জাভা 11-এ, কম্পাইলারটি আরও স্মার্ট হয়ে উঠেছে এবং এখন এটিকে নির্ধারিত মানের ধরণের উপর ভিত্তি করে একটি ঘোষিত ভেরিয়েবলের ধরন নির্ধারণ করতে পারে । কোডে, এটি এই মত দেখায়:

var name = value;

nameএকটি নতুন ভেরিয়েবলের নাম কোথায় , মান হল তার প্রাথমিক মান, এবং varএকটি কীওয়ার্ড যা ভেরিয়েবল ঘোষণা করতে ব্যবহৃত হয়। নাম ভেরিয়েবলের ধরন এটিতে নির্ধারিত মানের প্রকারের মতোই হবে।

উদাহরণ:

আমরা কিভাবে কোড দেখতে কম্পাইলার কি দেখে
var i = 1;
int i = 1;
var s = "Hello";
String s = "Hello";
var console = new Scanner(System.in);
Scanner console = new Scanner(System.in);
var list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>();
var data = new int[]{1, 2, 3};
int[] data = new int[]{1, 2, 3};

কম্পাইলার নিজেই নির্ধারণ করে, বা অনুমান করে, ভেরিয়েবলের ধরন এটিকে নির্ধারিত মানের উপর ভিত্তি করে।

প্রোগ্রামাররা ভাষায় এই ধরনের একটি বৈশিষ্ট্য যোগ করতে হবে কিনা তা নিয়ে উত্তেজিত বিতর্ক। অনেক লোক আশঙ্কা করেছিল যে এটি varঅপব্যবহার করা হবে এবং সেই কোড পাঠযোগ্যতা ফলস্বরূপ ক্ষতিগ্রস্ত হবে।

এটিতে সত্যের একটি শস্য রয়েছে, তাই এটি varযেখানে কোডের পাঠযোগ্যতা বাড়ায় সেখানে ব্যবহার করা ভাল। উদাহরণস্বরূপ, এই দুটি ক্ষেত্রে:

কেস 1: ভেরিয়েবলের জন্য নির্ধারিত মানটি দেখলে, ভেরিয়েবলের ধরনটি অবিলম্বে পরিষ্কার হয়

কোড ব্যাখ্যা
var stream = url.getInputStream();
পরিবর্তনশীল একটিInputStream
var name = person.getFullName();
চলক হল aString

এই ক্ষেত্রে, আপনার ব্যবহার করা উচিত নয়var । আচ্ছা, ভেরিয়েবল এর ধরন কি?

কোড ব্যাখ্যা
var result = task.execute();
ভেরিয়েবলের ধরন নির্ধারণ করা কঠিন
var status = person.getStatus();
ভেরিয়েবলের ধরন নির্ধারণ করা কঠিন

কেস 2: কোড বোঝার জন্য ভেরিয়েবলের ধরন গুরুত্বপূর্ণ নয়

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

দীর্ঘ কোড কমপ্যাক্ট কোড
var data = stream.getMetaData();
storage.save(data)
আমরা streamস্ট্রীম থেকে মেটাডেটা পেয়েছি এবং এটি সংগ্রহস্থলে সংরক্ষণ করেছি storage। ভেরিয়েবলের dataনির্দিষ্ট ধরন গুরুত্বপূর্ণ নয়।

গোল্ডেন মানে

এখন আমি একই কোড লেখার তিনটি উপায় দেব। ব্যবহার করা varসেরা বিকল্প হবে।

কোড বিঃদ্রঃ
dest.writeHeaderInfo(src.getFileMetaInfo());
খুব কমপ্যাক্ট
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
একদম ঠিক
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
খুব বিস্তারিত

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

তৃতীয় সংস্করণ অত্যধিক শব্দপূর্ণ. headerInfoএকটি যে সত্য FileMetaInfoইতিমধ্যে getFileMetaInfo()পদ্ধতি থেকে মোটামুটি পরিষ্কার. মেটা তথ্য উদ্দেশ্য অনেক বেশি আকর্ষণীয়.



3. ডায়মন্ড অপারেটরের সাথে টাইপ বাদ দেওয়া:<>

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

ArrayList<String> list = new ArrayList<String>();

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

ArrayList<String> list = new ArrayList<>();

আপনি দেখতে পাচ্ছেন, আপনাকে আর দ্বিতীয়বার স্ট্রিং লিখতে হবে না। var অপারেটরের মতো দুর্দান্ত নয়, তবে এটি সেই সময়ে অগ্রগতির মতো মনে হয়েছিল।

সংগ্রহের ধরণে খালি কোণ বন্ধনীগুলিকে হীরা অপারেটর বলা হত , যেহেতু দুটি কোণ বন্ধনী অস্পষ্টভাবে একটি হীরার অনুরূপ।

একই সময়েvar কীওয়ার্ড এবং ডায়মন্ড অপারেটর ব্যবহার করা অবাঞ্ছিত :

var list = new ArrayList<>();

সংগ্রহে সংরক্ষিত উপাদানগুলির ধরণ সম্পর্কে কোনও তথ্য নেই এবং সংগ্রহের ধরনটি হবে ArrayList < Object >।



4. ডবল কোঁকড়া ধনুর্বন্ধনী

দ্রুত অ্যারে আরম্ভ মনে রাখবেন?

আমরা শুধু কোঁকড়া ধনুর্বন্ধনীতে মান তালিকাভুক্ত করেছি, যেমন:

উদাহরণ
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

জাভা এর নির্মাতারা একটি অ্যারের লেখার উপাদানগুলিকে সহজ করার জন্য কোঁকড়া ধনুর্বন্ধনী ব্যবহার করার ধারণাটি পছন্দ করেছিলেন। কিন্তু সংগ্রহ সম্পর্কে কি?

জাভার নির্মাতাদের সংগ্রহের জন্য যথেষ্ট সৃজনশীল চিন্তাভাবনাও ছিল, যা তাদের ডবল কোঁকড়া ধনুর্বন্ধনী সহ একটি কৌশল ব্যবহার করার অনুমতি দেয়।

চিনি সহ চিনি ছাড়া
var list = new ArrayList<String>()
{{
   add("Hello");
   add("How's");
   add("Life?");
}};
var list = new ArrayList<String>();

list.add("Hello");
list.add("How's");
list.add("Life?");

যদি কম্পাইলারটি বাম দিকের উদাহরণের মতো কোডের সম্মুখীন হয়, তাহলে এটি ডানদিকের কোডে রূপান্তরিত করে।

কোডটি অনেক বেশি কমপ্যাক্ট হয়ে যায় না। এখানে সঞ্চয়গুলি মোটামুটি নগণ্য: আপনাকে listপ্রতিবার লিখতে হবে না। ভেরিয়েবলের নামটি খুব দীর্ঘ হলে এটি সহায়ক হতে পারে।

কিন্তু যদি আপনি একটি প্রকল্পে এই ধরনের কোড জুড়ে আসেন, অবাক হবেন না 🙂