DSL (Domain-Specific Language) হল এমন একটি প্রোগ্রামিং ভাষা বা সিনট্যাক্স যা একটি নির্দিষ্ট ডোমেইন বা সমস্যা সমাধানের জন্য তৈরি করা হয়। Groovy তে Internal DSL এবং External DSL তৈরির জন্য খুবই শক্তিশালী এবং নমনীয় টুলস রয়েছে। Groovy এর সহজ এবং ফ্লেক্সিবল সিনট্যাক্স এই কাজের জন্য আদর্শ। নিচে আমরা Internal DSL এবং External DSL এর মধ্যে পার্থক্য এবং Groovy তে কীভাবে এগুলি তৈরি করা যায় তা আলোচনা করব।
Internal DSL হল এমন একটি DSL যা অন্য একটি সাধারণ প্রোগ্রামিং ভাষার মধ্যে লেখা হয়। এটি মূল ভাষার সিনট্যাক্স ব্যবহার করে, কিন্তু আপনার ডোমেইন বিশেষ কাজের জন্য একটি কাস্টম সিনট্যাক্স তৈরি করা হয়।
Groovy তে Internal DSL তৈরি করার সময়, আপনি Groovy এর নেটিভ সিনট্যাক্স ব্যবহার করে ডোমেইন বিশেষ ভাষা তৈরি করতে পারেন, যেমন নতুন ক্লাস, মেথড, বা কাস্টম গ্রামার ব্যবহার করে। Internal DSL গুলি সাধারণত অন্য ভাষার উপর ভিত্তি করে কাজ করে, তবে তার নিজস্ব নিয়ম এবং কাঠামো তৈরি করা হয়।
ধরা যাক, আমাদের একটি "Command" সিস্টেম তৈরি করতে হবে, যেখানে একাধিক কমান্ড একসাথে কাজ করবে। আমরা Groovy এর স্টেটমেন্ট সিনট্যাক্স ব্যবহার করে সহজেই একটি Internal DSL তৈরি করতে পারি।
class Command {
def commands = []
def addCommand(String command) {
commands << command
}
def execute() {
commands.each { println "Executing: $it" }
}
}
// Internal DSL Syntax for command
def myCommands = new Command()
myCommands.addCommand('Start Service')
myCommands.addCommand('Stop Service')
myCommands.execute()
আউটপুট:
Executing: Start Service
Executing: Stop Service
এখানে Command
ক্লাসে আমরা addCommand
মেথড ব্যবহার করে কমান্ড গুলি যুক্ত করেছি এবং execute
মেথড ব্যবহার করে সেগুলি একে একে কার্যকর করেছি। এটি একটি Internal DSL উদাহরণ যেখানে Groovy এর সাধারণ সিনট্যাক্স ব্যবহার করে একটি কাস্টম DSL তৈরি করা হয়েছে।
External DSL হল একটি আলাদা ভাষা যা সম্পূর্ণ পৃথক এবং স্বতন্ত্রভাবে কাজ করে। এই ধরনের DSL গুলি সাধারণত অন্য ভাষার মধ্যে রেন্ডার বা এক্সিকিউট করা হয়। একটি External DSL তৈরি করতে সাধারণত একটি টেক্সট প্যাটার্ন বা সিনট্যাক্স তৈরি করতে হয়, যা পরে পার্সার বা ট্রান্সলেটর দিয়ে বিশ্লেষণ করা হয়। Groovy তে External DSL তৈরি করার জন্য সাধারণত Parsing লাইব্রেরি বা ANTLR (Another Tool for Language Recognition) ব্যবহার করা হয়।
ধরা যাক, আমাদের একটি সিম্পল ক্যালকুলেটর DSL তৈরি করতে হবে, যেখানে দুটি সংখ্যার যোগফল নির্ধারণ করা হবে।
add 5 to 10
multiply 3 by 4
class Calculator {
def execute(String dsl) {
def commandParts = dsl.split(" ")
def result = 0
switch (commandParts[0]) {
case "add":
result = commandParts[1].toInteger() + commandParts[3].toInteger()
break
case "multiply":
result = commandParts[1].toInteger() * commandParts[3].toInteger()
break
}
return result
}
}
// Example usage
def calc = new Calculator()
println calc.execute("add 5 to 10") // Output: 15
println calc.execute("multiply 3 by 4") // Output: 12
আউটপুট:
15
12
এখানে, Calculator
ক্লাস একটি সিম্পল DSL প্যাটার্ন যেমন add 5 to 10
এবং multiply 3 by 4
পার্স করে এবং এগুলিকে সঠিক অপারেশন (যেমন যোগফল এবং গুণফল) হিসেবে এক্সিকিউট করেছে। এটি একটি External DSL উদাহরণ, যেখানে আমরা আমাদের নিজস্ব টেক্সট সিনট্যাক্স ব্যবহার করেছি এবং পরে সেটা পার্স এবং প্রক্রিয়া করা হয়েছে।
বৈশিষ্ট্য | Internal DSL | External DSL |
---|---|---|
ভাষার একীকরণ | মূল প্রোগ্রামিং ভাষার মধ্যে লেখা হয়। | আলাদা ভাষা, সাধারণত নতুন সিনট্যাক্স তৈরি হয়। |
সংগঠন এবং সিনট্যাক্স | Groovy এর নিজস্ব সিনট্যাক্স ব্যবহার হয়। | সম্পূর্ণ নতুন সিনট্যাক্স তৈরি হয়। |
পরিবর্তনযোগ্যতা | কম, কারণ এটি মূল ভাষার উপর নির্ভরশীল। | বেশি, কারণ এটি একটি স্বতন্ত্র ভাষা। |
প্রয়োগ এবং ব্যবহৃত ক্ষেত্র | কোডিং আরও নমনীয়, দ্রুত এবং পরিষ্কার হয়। | বিশেষ ধরনের ভাষার প্রয়োগে উপকারী (যেমন SQL, পিকোস্ক্রিপ্ট)। |
পার্সিং | স্বাভাবিক Groovy মেথড বা ক্লাস ব্যবহার করা হয়। | একটি পার্সার বা ট্রান্সলেটর ব্যবহার করা হয়। |
common.read_more