সি শার্প ও ডট নেট প্রোগ্রামিং [৮ম-পর্ব] :: নেমস্পেস, এক্সেপশন হ্যান্ডলিং এবং প্রোপার্টিজ (Namespace, Exception Handling and Properties)

সি-শার্প এবং ডট নেট প্রোগ্রামিং টিউটোরিয়াল

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

  • Namespace
  • Exception Handling
  • Properties

নেমস্পেস (Namespace):

আমাদের প্রথম বিষয় হল নেমস্পেস (namespace), namespace হল একই ধরনের ক্লাসের সমষ্টি। ক্লাস কি-সেটা নিয়ে পূর্বের টিউনে আলোচনা করেছি। এখন প্রশ্ন হতে পারে, namespace

কেন ব্যবহার করব? এটা একটি উদাহরন দিয়ে বোঝানো সম্ভব। যাদের প্রোগ্রামিং ল্যাঙ্গুয়েজ নিয়ে সামান্যতম জ্ঞ্যান রয়েছে, তারা নিশ্চই এটা জানেন যে সকল প্রোগ্রামিং ল্যাঙ্গুয়েজে অসংখ্য নিজস্ব বিল্ট-ইন ক্লাস থাকে যেগুলো সিস্টেম ক্লাস নামে পরিচিত। এখন মনে করুন, আপনি নিজের একটি ক্লাস বানাতে যাচ্ছেন যার নাম Form.cs, এখন সমস্যা হল নামে একটি সিস্টেম ক্লাস আছে। তথাপি, আপনি যখন আপনার Form ক্লাস কে ব্যবহার করবেন, কম্পাইলার কিভাবে বুঝবে যে কোন ক্লাস কল করতে হবে, কারন একই নামে একটি সিস্টেম ক্লাস ও আরেকটি ইউজার-ডিফাইন্ড ক্লাস রয়েছে। এই সমস্যার সমাধান করার জন্যই namespace ব্যাবহার করতে হয়।

আপনি namespace ব্যাবহার করে যেকোন ক্লাস কেই কল করতে পারেন।

যেমনঃ

System.Windows.Form

এভাবে আপনি সিস্টেম ক্লাস Form ব্যবহার করছেন।

অথবা, MyClass.Form

এভাবে নিজের তৈরী ক্লাস কেও ব্যবহার করতে পারেন। এখানে MyClass হল namespace

নিচের স্ক্রীনশট দেখুন, আশা করি বুঝতে পারবেন।

Exception Handling:

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

Exception সাধারণত তিনটি কিওয়ার্ড ব্যবহার করে।

  • try
  • catch
  • finally

Syntax:

try

{

//Suspicious Code That May Cause Error

}

catch(Exception)

{

//do something when exception occurs

}

Try/catch block:

আপনি যখন মনে করবেন যে আপনার কোডের কোন অংশ বা এলিমেন্ট এক্সেপশন দেখাতে পারে, সেটা আপনি try block এর ভিতরে লিখবেন। যদি, try block এ লেখা কোড এলিমেন্ট এক্সেপশন throw করে তাহলে catch block এক্সিকিউট হবে। catch block হল এমন স্থান যেখানে আপনি এক্সেপশন টা ধরবেন এবং এক্সেপশন হলে কি কাজ করতে হবে তা নির্ধারন করে দিতে পারেন।

Finally block:

অনেক সময় এক্সেপশন আপনার প্রোগ্রাম কে একটি অনিশ্চিত পর্যায়ে নিয়ে যেতে পারে, যেখান থেকে আপনি কোন কাজ করতে পারবেন না, অথচ আপনার কম্পিউটারের রিসোর্স (মেমোরি, ডিস্ক স্পেস ইত্যাদি) অপচয় করবে। এমন অবস্থা থেকে বার হবার জন্য সচরাচর উপরের try/catch  ব্যাবহার করে থাকি, কিন্তু যদি এমন কোন অবস্থা আসে, যেখানে আপনার প্রোগ্রাম এক্সেপশন দেখাক আর নাই দেখাক আপনাকে আপনার কাজ সম্পন্ন করে কিছু নির্দিষ্ট কাজ অবশ্যই করতে হবে (যেমন, ফাইল ওপেন করে Read এর পর ফাইল বন্ধ করে সকল রিসোর্স ছেড়ে দিতে হবে)। এধরনের নির্দিষ্ট কাজ যা এক্সেপশন হবে কি হবে না, তার উপর নির্ভরশীল নয়, এসকল ক্ষেত্রে Finally ব্যবহার করা হয়। সাধারনতঃ try/catch এর পরে লেখা হয়ে থাকে।

try

{

//Code to be checked for exception

}

catch (Exception e)

{

//Code for taken measures to avoid exception

}

finally

{

//Code that has to be executed irrespective to the occurrence of exception

}

প্রোপার্টিজ ও এনক্যাপ্সুলেটিং (Properties and Encapsulating)

প্রোপার্টিজ একটি গুরুত্বপূর্ণ বিষয় এরজন্য আপনাদের পূর্বের টিউনের কিছু বিষয় সম্পর্কে সম্যক ধারনা থাকতে হবে (যেমন-ক্লাস, এনক্যাপ্সুলেশন, এক্সেস স্পেসিফায়ার)

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

  • প্রথমতঃ আমাদের ক্লাসের ডাটা নিরাপত্তা নিশ্চিত করা।
  • দ্বিতীয়তঃ ক্লাসের কোন ভ্যারিয়েবেল বাইরের কোন অংশ থেকে Read/Write করার সুবিধা প্রদান করা।

সমাধানঃ

  • প্রথম সমস্যার সমাধান হলঃ আমরা প্রাইভেট এক্সেসিফায়ার ব্যবহার করতে পারি যা আমাদের দ্বিতীয় সমস্যার সমাধান দেয় না।
  • দ্বিতীয় সমস্যার জন্য আমরা প্রাইভেট ব্যাবহার না করে পাবলিক এক্সেসিফায়ার ব্যবহার করতে পারি যা পুনরায় প্রথম সমস্যা কে তুলে আনে অর্থাৎ ডাটা নিরাপত্তা নিশ্চিত করা সম্ভব নয়।

এজন্য এমন একটি তৃতীয় উপায় বার করা প্রয়োজন যা একিসাথে আমাদের দুইটি সমস্যার সমাধান করবে। এমন একটি উপায়ের নাম হলঃ প্রোপার্টিজ ব্যবহার করা।

প্রোপার্টিজ ব্যবহার করে আপনিঃ

  • ডাটা নিরাপত্তা দিতে পারবেন, অর্থাৎ ডাটা ভ্যারিয়েবেল প্রাইভেট থাকবে এবং বাইরের কোন অংশ থেকে যে কেউ যথেচ্ছ ভাবে তা পরিবর্তন করতে পারবে না।
  • দ্বিতীয়তঃ যখন কোন প্রাইভেট ভ্যারিয়েবেল এর মান পরিবর্তনের দরকার হবে তখন তা সহজ ভাবে নিয়ন্ত্রিত ভাবে করা যাবে।

আপনি কোন ডাটা ভ্যারিয়েবেল এউপায়ে ব্যাবহার করবেন তখন আপনাকে ডাটা এঙ্ক্যাপ্সুলেট করতে হবে। কিভাবে তা করবেন তা নিচে দেয়া হলঃ

  1. প্রথমে যে ডাটা ভ্যারিয়েবেল এঙ্ক্যাপ্সুলেট করতে চান, তা নির্বাচন করুন, ভ্যারিয়েবেলের নামের উপর মাউজ কার্সর রেখে রাইট-ক্লিক করুন এবং Refactor select করুন (আরেকটি পপ-আপ মেনু আসবে) অথবা উপরের মেনু বার থেকে Refactor মেনু ক্লিক করুন.

2)      এরপর, দেখুন এখানে মাঝামাঝি Encapsulate Field অপশন রয়েছে। তা ক্লিক করুন অথবা Ctrl key চেপে R এবং পরে E press করুন। এরপর নিচের মত একটি উইন্ডো আসবে এবং আপনাকে দেখাবে কোন ডাটা Encapsulate করা হচ্ছে এবং করার পর কি নাম হবে। আপনি এখান থেকে নতুন নাম দিয়ে দিতে পারেন। OK ক্লিক করুন।

এরপর আরেকটি উইন্ডো আসবেঃ

এবার Apply click  করুন আর দেখুন আপনার ভ্যারিয়েবেল Encapsulated হয়ে গিয়েছে।

এখানে দেখুন, আমাদের উদাহরনে data_no  নামে একটি ইন্টিজার টাইপের প্রাইভেট ভ্যারিয়েবেল এঙ্ক্যাপ্সুলেত করার কারনে একটি Data_no  নামে প্রোপার্টি ফিল্ড তৈরী হয়েছে যার নিজস্ব দুইটি ফাংশন আছেঃ

  • get
  • set

get function টি লক্ষ করুন যেখানে data_no filed টিকে return  করা হচ্ছে। এর অর্থ হলঃ এই get function টির মাধ্যমে আমরা ডাটা Read করতে পারব। অনুরূপভাবে set এর মাধ্যমে ডাটা write করা যাবে।

কিভাবে একটি ভ্যারিয়েবেল কে Read Only করা যায়ঃ

উপরের উদাহরন থেকে লক্ষ করুন, আমরা একটি ভ্যারিয়েবেল কে encapsulate করার সময় get এবং set দুইটি ফাংশন তৈরী হচ্ছে Read/Write এর জন্য। এখন এমন প্রয়োজন হতে পারে যে শুধু ডাটা Read করার প্রয়োজন হল কিন্তু Write করার প্রয়োজন নেই। সেক্ষেত্রে কি করবেন?

সব থেকে সহজ ভাবে চিন্তা করে দেখুন, আমি যদি উপরের উদাহরনে Encapsulated field

Data_no  থেকে শুধু set ফাংশন মুছে দেই তাহলে কিন্তু শুধু get ফাংশনের কারনে ডাটা Read করতে পারবেন কিন্তু Write হবে না। তাহলে তাই করুনঃ উপরের পদ্ধতি অনুসারে Data Encapsulate করুন, কিন্তু শুধু set ফাংশন মুছে দিন। নিচের ছবিটি লক্ষ করুনঃ

একি ভাবে আপনি Write Only attribute তৈরী করতে পারবেন।

কিভাবে এনক্যাপ্সুলেটেড ফিল্ড বাইরের কোন ক্লাস বা মেথড থেকে এক্সেস করবেনঃ

এতক্ষন দেখলাম কিভাবে ডাটা এঙ্ক্যপাসুলেত করতে হয়, এখন দেখব কিভাবে এসব ডাটা বাইরের ক্লাস থেকে এক্সেস করতে হয়। বাইরের কোন ক্লাস বা মেথড থেকে এক্সেস করার একটি জনপ্রিয় এবং সম্ভবতঃ একমাত্র উপায় হল আপনি যে ডাটা এক্সেস করবেন সেই ডাটা টি যে এক্সটার্নাল ক্লাসের সদস্য সেই ক্লাসের অবজেক্ট/ইন্সটেন্স তৈরী করার মাধ্যমে। আমাদের উদাহরনে ডাটা ফিল্ড গুলো যেগুলা এঙ্ক্যাপ্সুলেট করলাম সেগুলা Encapsulation নামক একটি ক্লাসের সদস্য (Data Member)।

এখন আরেকটি ক্লাস যার নাম Access, তার নিজস্ব ফাংশন থেকে এনক্যাপ্সুলেটেড ফিল্ড গুলো এক্সেস করব।

একিভাবে Write করার জন্যঃ

মনে রাখবেনঃ আপনি ডাটা Read/Write যাই করুন না কেন, সেটা হবে এনক্যাপসুলেটেড ফিল্ড এর get বা set function দিয়ে। তাই যদি কোন Read Only field (যার set function আপনি পূর্বে মুছে দিয়েছেন) উপরের স্ক্রিনশটের মত write করতে চান তাহলে প্রোগ্রাম রান করবে না। একি কথা Write Only field এর ক্ষেত্রেও প্রযোজ্য।

এভাবে আপনি ডাটা এনক্যাপসুলেশনের মাধ্যমে ডাটা নিরাপত্তা ও নিয়ন্ত্রীত প্রবেশাধিকার নিশ্চিত করতে পারেন।

আজকে এই পর্যন্ত। আশা করি আপনাদের সবার ভাল লাগবে। ধন্যবাদ।

Level 0

আমি জ্যোতি। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 13 বছর 3 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 17 টি টিউন ও 98 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 2 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।

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


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস

Thanks for the tune.

অনেক দিন পর টিউন করলেন।

আপনার আগের টিউন গুলো আমি পরেছি।

চমৎকার।

😀

ধন্যবাদ ভাই আপনাকে। আপনি আমার টিউন পড়েন শুনে ভাল লাগল। পড়াশোনা আর পাশাপাশি কিছু প্রজেক্টের কাজ এর কারনে খুব ব্যস্ত হয়ে পড়েছিলাম। এই টিউন টা লিখতে ২ মাস লাগল…আশা করি পরের পর্ব তারাতারি পাবেন।

    @জ্যোতি:

    C# .NET নিয়ে করা আপনার টিউন গুলো বাংলা ভাষায় একটি আদর্শ Documentation হয়ে থাকবে, যা অনেক মানুষের উপকারে আসবে।

    আমার মনে হয় C# নিয়ে যারা seriously এগোতে চান বা ভালভাবে জানতে চান, তারা সবাই C বা C++ জাতীয় কোন একটা Language আগে থেকে জেনে থাকবেন। তাই নিঃসন্দেহে যে বিষয় গুলকে basic programming knowledge বলে মনে হবে, সেগুলোকে ভাই skip করতে পারেন।

    আর আমরা কোন কিছু না বুঝলে comment এর সুযোগ তো আছেই।

    এতে হয়ত আপনার hesitation অনেকটাই কমবে ( আর আমরা বেশি বেশি টিউন পাব 🙂 )।

    অনেক ধন্যবাদ ভাই।

    🙂 🙂 🙂

      @নামনাই: অনেক ধন্যবাদ ভাই আপনার সুচিন্তিত মতামতের জন্য। আসলেই আমি এই ব্যাপার টা নিয়ে খুব চিন্তায় থাকি, যে আমি যা লিখছি তা পাঠকের জন্য আর তারাই যদি না বুঝতে পারে তাহলে আমার লেখার কোন মানে নেই। যাইহোক, আপনি অনেক ভাল কথা বলেছেন, মাথায় রাখব নেক্সট টিউন করার সময়।
      অনেক ভাল থাকবেন। শুভ কামনা রইল। 🙂

        Level 2

        @জ্যোতি: Kindly tune korar style change koiren na. Ami apnar sobgula tune e dekhi onno der k suggest kori eta dekhe practice korar jonno. Tune dekhe sobie buje. Ja ase 100 % Perfect. Apnar mone ase—-> Apnake bolesilam C# complete howar por ekta project tune korar jonno. jeta sobar jonno onek upokar hobe. Ek kothai apnar tune awesome. Waiting for your next tune. 🙂 🙂 🙂

          @farhadjoy: অনেক ধন্যবাদ জয় ভাই আপনাকে। আপনাদের কাছ থেকে আমি অনুপ্রেরণা পাই।

Level 0

অনেক দিন পর টিউন করলেন।

আপনার আগের টিউন গুলো আমি পরেছি।

carry on vaiya

    @coder_ami: অনেক ধন্যবাদ ভাইয়া। আপনাদের ভাল লাগছে, এটাই আমার অনেক বড় পাওয়া…ভাল থাকবেন।

আপনার ইমেইল এড্রেসটা পেতে পারি?

[email protected]

বিশাল বড় মেইল এড্রেস। নিজেই বিরক্ত হয়ে যাই লেখার সময়।

Brother im already a student of C# in DIIT. bujte parsi apni onek valo janen. nice post. i want to communicate u.
is it possible????????

Level 0

vai, onek valo hoyese. c# ami noton shiktesi. aponaer post golo amar khub kaje lagbee. doya kore chaliye jan. Thank U.

via tune ta onek hepful hoyeche. onek sohoj kore lekha..tune deta thakun plz