একবারেই ORM

একবারেই ORM

লার্নিং অনুশীলনী

ভূমিকা

রিসোর্সের লাইফটাইম

resource-cleanup IDispose ইন্টারফেস ব্যবহার করে বোঝায় যে, কোনো অবজেক্টের রিসোর্স বা প্রোগ্রামের অন্য কোনো স্টেট তখন ছেড়ে দিতে বা রিসেট করতে হয়, যখন ওই অবজেক্টটির আর দরকার থাকে না (আর গার্বেজ কলেক্টরের উপর ভরসা করে এটা করা যাবে না, বা প্রয়োজনীয় মাত্রার নিয়ন্ত্রণও পাওয়া যাবে না), এবং এই ধরনের পরিষ্কার করার কাজের স্বাভাবিক জায়গা হলো IDisposable.Dispose() মেথড।

আরেকটি কনস্ট্রাক্ট আছে, using ব্লক, যার সাহায্যে কলারের দৃষ্টিকোণ থেকে রিসোর্স লাইফটাইমের পুরো ব্যবস্থাপনা একটি স্টেটমেন্টে একত্র করা যায়।

using (var file = new File("my_secrets"))
{
    file.WriteSecret("xxxxxxx");
}

উপরের উদাহরণে file-এর সাথে জড়িত ফাইল সিস্টেম রিসোর্সগুলো using ব্লক থেকে বেরিয়ে গেলেই অপারেটিং সিস্টেমে ফিরিয়ে দেওয়া হবে।

এই প্যাটার্নটি কাজ করতে হলে using স্টেটমেন্টের ভ্যারিয়েবলটি অবশ্যই এমন একটি রেফারেন্স টাইপ হতে হবে, যা IDisposable ইন্টারফেস ইমপ্লিমেন্ট করে, আর তার Dispose() মেথডে রিসোর্স ছেড়ে দিতে হবে বা প্রোগ্রামের স্টেট রিসেট করতে হবে।

C# 8 এই প্যাটার্নে আরেকটি পরিমার্জন নিয়ে আসে। using স্টেটমেন্ট একটি ব্লকের শুরুতে বসানো যেতে পারে।

using var drawingResource = some_provided_or_new_object;
try
{
    drawingResource.DrawSomething();
}
catch (Exception)
{
    throw;
}

Java ডেভেলপাররা এটাকে Java 7-এ আসা automatic resource management মেকানিজমের সমতুল্য কিছু হিসেবে চিনতে পারবেন।

নির্দেশনা

আপনি আবারও ORM (Object Relationship Mapping) সিস্টেম নিয়ে কাজ করছেন, যেটি object-relational-mapping অনুশীলনীতে পরিচয় করিয়ে দেওয়া হয়েছিল।

আমাদের ORM ব্যবহারের বিশ্লেষণে দেখা গেছে, ৯৫% ট্রানজেকশন একটি মাত্র কলিং মেথডের ভেতর থেকেই চালানো হয়। তাই সিদ্ধান্ত হয়েছে, একটি একক ORM মেথড থাকাই বেশি যুক্তিযুক্ত, যা একটি ট্রানজেকশন খুলবে, লিখবে এবং কমিট করবে।

ডেটাবেসে নিচের ইনস্ট্যান্স মেথডগুলো আছে:

  • Database.BeginTransaction() ডেটাবেসে একটি ট্রানজেকশন শুরু করে।
  • Database.Write(string data) ট্রানজেকশনের ভেতরে ডেটাবেসে ডেটা লেখে। খারাপ ডেটা পেলে একটি এক্সেপশন ছুড়ে দেওয়া হবে। আগে BeginTransaction() কল না করে এই মেথড কল করার চেষ্টা করলে একটি এক্সেপশন ছুড়ে দেওয়া হবে। সফল হলে ডেটাবেসের অভ্যন্তরীণ স্টেট DataWritten-এ বদলে যাবে।
  • Database.EndTransaction() ডেটাবেসে ট্রানজেকশনটি কমিট করে। ট্রানজেকশন বন্ধ করতে না পারলে বা Database.BeginTransaction() কল করা না থাকলে এটি একটি এক্সেপশন ছুড়তে পারে।
  • ট্রানজেকশনের মাঝে কোনো এক্সেপশন ছুড়ে দেওয়া হলে Database.Dispose() কল করলে ডেটাবেস পরিষ্কার করা হবে। এতে ডেটাবেসের স্টেট Closed-এ বদলে যাবে।

1. ডেটাবেসে লিখুন

ডেটাবেস ট্রানজেকশন শুরু করতে, পাঠানো ডেটা লিখতে এবং ট্রানজেকশন কমিট করতে Orm.Write() মেথডটি ইমপ্লিমেন্ট করুন। InvalidOperationException-সহ সব এক্সেপশনই কোনো লগিং বা অন্য কোনো হস্তক্ষেপ ছাড়া কলারের কাছে চলে যেতে দেওয়া উচিত।

Database db = new Database();
Orm orm = new Orm(db);
orm.Write("good write");
// => database has an internal state of State.Closed
orm.Write("bad write");
// => an exception is thrown but database is left with an internal state of State.Closed
orm.Write("bad commit");
// => an exception is thrown but database is left with an internal state of State.Closed

2. ডেটাবেসে লিখুন এবং কলারকে জানান লেখাটি সফল হয়েছিল কি না

Orm.Write() চালু হওয়ার পর কয়েক মাস কেটে গেছে, আর দলটির মধ্যে মতভেদ দেখা দিয়েছে। অনেক ডেভেলপার চান ORM নিজেই এক্সেপশন ছুড়ে দেওয়া হলে এররগুলো সামলাক এবং কলারকে কেবল সাফল্যের একটি ইঙ্গিত ফিরিয়ে দিক।

অনুগ্রহ করে Orm.WriteSafely() মেথডটি ইমপ্লিমেন্ট করুন, যা একটি ডেটাবেস ট্রানজেকশন শুরু করবে, পাঠানো ডেটা লিখবে এবং ট্রানজেকশন কমিট করবে (উপরের মতোই)। লেখাটি সফল হলে এটি true রিটার্ন করবে, নাহলে false। এক্সেপশনটি লগ করার চেষ্টা করবেন না।

Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
C# Exercism

একবারেই ORM শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, C# ট্র্যাকের 62টি কনসেপ্ট178টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।