Vivasoft-logo

যা শিখলাম

  1. ইন্টারফেস (interface) বলতে চুক্তি করা বোঝায় যা অন্য ক্লাস ইনহেরিট না করে ইমপ্লিমেন্ট (Implement) করবে
  2. অ্যাবস্ট্রাকশান : লো লেভেল ডিপেন্ডেন্সি যেমন কনক্রিট ক্লাসের উপরে ডিপেন্ড না করে হাই লেভেল ডিপেন্ডেন্সি যা কিনা প্যারেন্ট ক্লাস বা ইন্টারফেস বা অ্যাবস্ট্রাক ক্লাসের উপর ডিপেন্ড করাকে বোঝায়
  3. ইন্টারফেস (Interface) নেমিং কনভেনশন : i. আজেক্টিভ (Adjective) বা -এবেল (-able) : Soundable – contains : Sound() , Moveable – contains : Move(), ii. C# এ প্রিফিক্স – I – prefix ব্যবহার করতে হবে : ISoundable – contains : Sound(), IMoveable – contains : Move()
  4. মাল্টি লেভেল ইনহেরিটেন্স ব্যবহার করলে কোডে কমপ্লেক্সসিটি ও লজিক্যাল এরর তৈরি হতে পারে সমাধান হিসেবে ইন্টারফেস ব্যবহার করে হ্যাজ এ রিলেশন দিয়ে কম্পোনেন্ট হিসেবে সিস্টেম ডিজাইন করা ভালো।
  5. পিওর অ্যাবস্ট্রাক্ট ক্লাসে সবগুলো মেথড বা (সি# এ প্রপার্টি, অন্যান্য সিংনেচার) সবই অ্যাবস্ট্রাক্ট হবে।
  6. অ্যাবস্ট্রাক্ট ক্লাস (Abstract Class) ও ইন্টারফেস (Interface) এর মধ্যে পার্থক্য : ইন্টারফেস ও অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে এখনকার পার্থক্য হচ্ছে সিনট্যাকটিক্যাল পরিবর্তন। অ্যাবস্ট্রাক্ট ক্লাসে কনস্ট্রাক্টর থাকতে পারে ইন্টারফেসর তা থাকতে পারে না, ওভারাইড মেথড থাকতে পারে কিন্তু ইন্টারফেসে তা থাকতে পারেনা।
  7. সরাসরি অ্যাপ্লিকেশনে কাস্টিং না করাই উত্তম, তবে আপকাস্টিং হতে পারে তাও ইম্প্রেসিট যেটা ভালো ডাউনকাস্টিং থেকে, ডাউনকাস্টিং এ রান-টাইম ইসু হতে পারে।

এসো নিজে করি

নিচে আমরা জাভা (Java) ও সি# (C#) এর code করে রেখেছি যাতে আমরা ইন্টারফেস ব্যবহার করিনি। যেহেতু ইন্টারফেস ব্যবহার করিনি সেহেতু কোডটি অনেক বড় হয়েছে এবং সহজ হয়নি এবং এতে নতুন কিছু সংযোগ করতে হলে অনেক চেঞ্জ বা পরিবর্তন করার দরকার হয়।

এখানে ইন্টারফেস ব্যবহার করে কোডটিকে কিভাবে আমরা আরও সংক্ষিপ্ত করতে পারি এবং সহজে পরিবর্তনশীল করতে পারি তাই এখানে আমাদের এসো নিজে করির কাজ।

এখানে একটি জিনিস খুবই লক্ষণীয় যে প্রতিবারই ConnectToSQLiteDatabase, ConnectToPostgreSQLDatabase ইত্যাদিতে এই ধরনের অনেকগুলো code লেখা হয়েছে। যা আমরা কিভাবে এড়িয়ে চলতে পারি এবং আমরা স্ট্রংলি টাইপ (যেমন object লিস্ট ব্যবহার না করা) বিহেভিয়ার নিয়ে আসতে পারি করে তাও এখানকার একটি বড় চ্যালেঞ্জ।

লিংকঃ http://tpcg.io/_G0CIHH

//জাভা (Java)
public class DatabaseConnectionExample {
    public static class PostgreSQLDB {
        public void Connect() {
            System.out.println(“Connecting to PostgreSQL database”);
        }
    }
    public static class SQLiteDatabase {
        public void Connect() {
            System.out.println(“Connecting to SQLite database”);
        }
    }
    public static class MSSQLServerDB {
        public void Connect() throws Exception {
            throw new Exception(“Cannot connect to MSSQL Server”);
        }
    }
    public static void ConnectToMSSQLServerDatabase(MSSQLServerDB db) {
        try {
            db.Connect();
            System.out.println(“Successfully connected to ” + db.getClass().getName() + “\n”);
        } catch (Exception ex) {
            System.out.println(“Error connecting to database: ” + ex.getMessage() + “\n”);
        }
    }
    public static void ConnectToPostgreSQLDatabase(PostgreSQLDB db) {
        try {
            db.Connect();
            System.out.println(“Successfully connected to ” + db.getClass().getName() + “\n”);
        } catch (Exception ex) {
            System.out.println(“Error connecting to database: ” + ex.getMessage() + “\n”);
        }
    }
    public static void ConnectToSQLiteDatabase(SQLiteDatabase db) {
        try {
            db.Connect();
            System.out.println(“Successfully connected to ” + db.getClass().getName() + “\n”);
        } catch (Exception ex) {
            System.out.println(“Error connecting to database: ” + ex.getMessage() + “\n”);
        }
    }
    public static void main(String[] args) {
        Object[] databases = {
            new PostgreSQLDB(),
            new SQLiteDatabase(),
            new MSSQLServerDB(),
        };
        for (Object db : databases) {
            if (db instanceof PostgreSQLDB) {
                ConnectToPostgreSQLDatabase((PostgreSQLDB) db);
            } else if (db instanceof SQLiteDatabase) {
                ConnectToSQLiteDatabase((SQLiteDatabase) db);
            } else if (db instanceof MSSQLServerDB) {
                ConnectToMSSQLServerDatabase((MSSQLServerDB) db);
            }
        }
    }
}

Output:

//জাভা (Java) – Output
Connecting to PostgreSQL database
Successfully connected to DatabaseConnectionExample$PostgreSQLDB
Connecting to SQLite database
Successfully connected to DatabaseConnectionExample$SQLiteDatabase
Error connecting to database: Cannot connect to MSSQL Server

লিংকঃ https://dotnetfiddle.net/jUhRLG

using System;
using System.Collections.Generic;
namespace DatabaseConnectionExample
{
	public class PostgreSQLDB
	{
		public void Connect()
		{
			Console.WriteLine(“Connecting to PostgreSQL database”);
		}
	}
	public class SQLiteDatabase
	{
		public void Connect()
		{
			Console.WriteLine(“Connecting to SQLite database”);
		}
	}
	public class MSSQLServerDB
	{
		public void Connect()
		{
			throw new Exception(“Cannot connect to MSSQL Server”);
		}
	}
	class Program
	{
		public static void ConnectToMSSQLServerDatabase(MSSQLServerDB db)
		{
			try
			{
				db.Connect();
				Console.WriteLine($”Successfully connected to {db.GetType().Name}\n”);
			}
			catch (Exception ex)
			{
				Console.WriteLine($”Error connecting to database: {ex.Message}\n”);
			}
		}
		public static void ConnectToPostgreSQLDatabase(PostgreSQLDB db)
		{
			try
			{
				db.Connect();
				Console.WriteLine($”Successfully connected to {db.GetType().Name}\n”);
			}
			catch (Exception ex)
			{
				Console.WriteLine($”Error connecting to database: {ex.Message}\n”);
			}
		}
		public static void ConnectToSQLiteDatabase(SQLiteDatabase db)
		{
			try
			{
				db.Connect();
				Console.WriteLine($”Successfully connected to {db.GetType().Name}\n”);
			}
			catch (Exception ex)
			{
				Console.WriteLine($”Error connecting to database: {ex.Message}\n”);
			}
		}
		static void Main(string[] args)
		{
			// Create a list of databases to connect to
			List databases = new List()
			{new PostgreSQLDB(), new SQLiteDatabase(), new MSSQLServerDB()};
			// Loop through the list and call the appropriate connect method for each database
			foreach (var db in databases)
			{
				if (db is PostgreSQLDB)
				{
					ConnectToPostgreSQLDatabase((PostgreSQLDB)db);
				}
				else if (db is SQLiteDatabase)
				{
					ConnectToSQLiteDatabase((SQLiteDatabase)db);
				}
				else if (db is MSSQLServerDB)
				{
					ConnectToMSSQLServerDatabase((MSSQLServerDB)db);
				}
			}
		}
	}
}

Output:

//Output – আউটপুট
Connecting to PostgreSQL database
Successfully connected to PostgreSQLDB
Connecting to SQLite database
Successfully connected to SQLiteDatabase
Error connecting to database: Cannot connect to MSSQL Server

নিচে আমরা জাভা (Java) ও সি# (C#) এর code করে রেখেছি যাতে আমরা ইন্টারফেস ব্যবহার করিনি। যেহেতু ইন্টারফেস ব্যবহার করিনি সেহেতু কোডটি অনেক বড় হয়েছে এবং সহজ হয়নি এবং এতে নতুন কিছু সংযোগ করতে হলে অনেক চেঞ্জ বা পরিবর্তন করার দরকার হয়।

এখানে ইন্টারফেস ব্যবহার করে কোডটিকে কিভাবে আমরা আরও সংক্ষিপ্ত করতে পারি এবং সহজে পরিবর্তনশীল করতে পারি তাই এখানে আমাদের এসো নিজে করির কাজ।

ইন্টারভিও প্রশ্ন

  1. ইন্টারফেস কি ? উদাহরণ দাও।
  2. অ্যাবস্ট্রাক্টশন কাকে বলে?
  3. অ্যাবস্ট্রাক্ট ক্লাস এবং ইন্টারফেসের মধ্যে পার্থক্য কি?
  4. একটি ইন্টারফেস কিভাবে একাধিক ইন্টারফেস inherit করতে পারে?
  5. ইন্টারফেসের ডিফল্ট মেথড এবং স্ট্যাটিক মেথড কি?
  6. মাল্টিপল ইনহেরিটেন্স এবং মাল্টিপল ইম্প্লিমেন্টেশনের মধ্যে পার্থক্য কি?
  7. ডায়ামন্ড প্রোবলেম কি? এটি কিভাবে সমাধান করা যায়?
  8. ফাংশনাল ইন্টারফেস কি?
  9. মার্কার ইন্টারফেস কি?
  10. আসোসিয়েশন (Association), এগগ্রিগেশন (Aggregation), কম্পোজিশন (Composition) কি?
  11. ডাউনকাস্টিং (Downcasting) কি এবং কেন এটা ক্ষতিকর?
  12. Is-a relationship কি?
  13. Has-a relationship কি?
  14. আপকাস্টিং (Upcasting) কাকে বলে?
  15. পিওর অ্যাবস্ট্রাক্ট ক্লাস কি? কিভাবে অ্যাবস্ট্রাক্ট ক্লাস কে পিওর অ্যাবস্ট্রাক্ট ক্লাসের রুপ দেয়া যায়?
  16. আপনি কিভাবে একটি কাস্টম মার্কার ইন্টারফেস তৈরি করতে পারেন?
  17. C# এর জন্য আপনি কেন একটি অ্যাবস্ট্রাক্ট ক্লাস থেকে আরেকটি অ্যাবস্ট্রাক্ট ক্লাসে inheritance করার জন্য sealed modifier ব্যবহার করবেন?
  18. Java এর জন্য আপনি কেন একটি অ্যাবস্ট্রাক্ট ক্লাস থেকে আরেকটি অ্যাবস্ট্রাক্ট ক্লাসে inheritance করার জন্য final keyword ব্যবহার করবেন?

উদ্ধৃতি

  1. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface
  2. https://en.wikibooks.org/wiki/C_Sharp_Programming/Interfaces
  3. https://stackoverflow.com/a/639656
  4. https://stackoverflow.com/a/1686267
  5. https://stackoverflow.com/a/10394722
  6. https://martinfowler.com/bliki/DependencyAndAssociation.html
  7. https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/types/interfaces
  8. https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members
  9. https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/interface-implementation/default-interface-methods-versions
  10. https://docs.oracle.com/javase/tutorial/java/concepts/interface.html
  11. https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
  12. https://www.w3resource.com/java-tutorial/inheritance-composition-relationship.php