কম বেশি সদস্যের (যেমন নেস্টেড) প্রকারের ব্যবহার নির্ভরশীল পদ্ধতি ধরণের প্রয়োজনের জন্ম দিতে পারে। বিশেষত, আমি বজায় রেখেছি যে নির্ভরশীল পদ্ধতি ছাড়াই ক্লাসিক কেকের ধরণটি অ্যান্টি-প্যাটার্ন হওয়ার কাছাকাছি রয়েছে।
তো সমস্যাটা কী? স্কালায় নেস্টেড প্রকারগুলি তাদের ঘেরের উদাহরণের উপর নির্ভরশীল। ফলস্বরূপ, নির্ভরশীল পদ্ধতির ধরণের অনুপস্থিতিতে এগুলি উদাহরণের বাইরে এগুলি ব্যবহার করার চেষ্টা হতাশাজনকভাবে কঠিন হতে পারে। এটি এমন নকশাগুলি ঘুরিয়ে দিতে পারে যা প্রাথমিকভাবে মার্শট এবং আকর্ষণীয় বলে মনে হয় মনস্ট্রাস্টিসগুলিতে যা রাত্রিকালীনভাবে অনমনীয় এবং চুল্লী করা শক্ত।
আমি আমার এডভান্সড স্কাল প্রশিক্ষণ কোর্স চলাকালীন একটি অনুশীলন দিয়ে চিত্রিত করব ,
trait ResourceManager {
type Resource <: BasicResource
trait BasicResource {
def hash : String
def duplicates(r : Resource) : Boolean
}
def create : Resource
// Test methods: exercise is to move them outside ResourceManager
def testHash(r : Resource) = assert(r.hash == "9e47088d")
def testDuplicates(r : Resource) = assert(r.duplicates(r))
}
trait FileManager extends ResourceManager {
type Resource <: File
trait File extends BasicResource {
def local : Boolean
}
override def create : Resource
}
class NetworkFileManager extends FileManager {
type Resource = RemoteFile
class RemoteFile extends File {
def local = false
def hash = "9e47088d"
def duplicates(r : Resource) = (local == r.local) && (hash == r.hash)
}
override def create : Resource = new RemoteFile
}
এটা তোলে সর্বোত্তম পিষ্টক প্যাটার্ন একটি উদাহরণ: আমরা বিমূর্ত যা ক্রমশ অনুক্রমের মাধ্যমে পরিশ্রুত করা হয় একটি পরিবার আছে ( ResourceManager
/ Resource
দ্বারা পরিশ্রুত করা হয় FileManager
/ File
যার দ্বারা পরিশ্রুত ঘুরে হয় NetworkFileManager
/ RemoteFile
)। এটি খেলনার উদাহরণ, তবে প্যাটার্নটি আসল: এটি স্কালার সংকলক জুড়ে ব্যবহৃত হয় এবং স্কালা ইক্লিপ্স প্লাগইনে ব্যাপকভাবে ব্যবহৃত হয়েছিল।
এখানে ব্যবহার বিমূর্তির উদাহরণ,
val nfm = new NetworkFileManager
val rf : nfm.Resource = nfm.create
nfm.testHash(rf)
nfm.testDuplicates(rf)
নোট করুন যে পাথ নির্ভরতার অর্থ সংকলকটি গ্যারান্টি দিবে যে এতে testHash
এবং testDuplicates
পদ্ধতিগুলি NetworkFileManager
কেবলমাত্র তার সাথে সম্পর্কিত আর্গুমেন্টের সাথে ডাকা যাবে। এটি নিজস্ব RemoteFiles
, আর কিছুই নয়।
এটি অনস্বীকার্যভাবে একটি আকাঙ্ক্ষিত সম্পত্তি, তবে মনে করুন আমরা এই পরীক্ষার কোডটিকে অন্য উত্স ফাইলে স্থানান্তরিত করতে চেয়েছিলাম? নির্ভরশীল পদ্ধতির ধরণের সাথে ResourceManager
শ্রেণিবদ্ধের বাইরে এই পদ্ধতিগুলি পুনরায় সংজ্ঞায়িত করা তুচ্ছভাবে সহজ ,
def testHash4(rm : ResourceManager)(r : rm.Resource) =
assert(r.hash == "9e47088d")
def testDuplicates4(rm : ResourceManager)(r : rm.Resource) =
assert(r.duplicates(r))
নির্ভরশীল পদ্ধতির ধরণের ব্যবহারগুলি এখানে নোট করুন: দ্বিতীয় আর্গুমেন্টের ধরণ ( rm.Resource
) প্রথম যুক্তি ( rm
) এর মানের উপর নির্ভর করে ।
নির্ভরশীল পদ্ধতির ধরণ ছাড়াই এটি করা সম্ভব, তবে এটি অত্যন্ত বিশ্রী এবং প্রক্রিয়াটি বেশ অদম্য: আমি প্রায় দুই বছর ধরে এই কোর্সটি শিখিয়ে চলেছি, এবং সেই সময়ে, কোনওরই নিরবচ্ছিন্ন একটি কার্যকর সমাধান নিয়ে এসেছিল।
এটি নিজের জন্য চেষ্টা করুন ...
// Reimplement the testHash and testDuplicates methods outside
// the ResourceManager hierarchy without using dependent method types
def testHash // TODO ...
def testDuplicates // TODO ...
testHash(rf)
testDuplicates(rf)
কিছুক্ষণ লড়াই করার পরে আপনি সম্ভবত আবিষ্কার করবেন যে আমি (বা সম্ভবত এটি ডেভিড ম্যাকআইভার ছিল, আমাদের মধ্যে কোনটি শব্দটি রচিত হয়েছিল তা আমরা মনে করতে পারি না) এটিকে ডুমের বেকারি বলে।
সম্পাদনা: sensক্যমত্য হ'ল ডুমার ম্যাকআইভারের মুদ্রা ছিল ডুমের বেকারি ...
বোনাসের জন্য: স্কালার সাধারণভাবে নির্ভরশীল ধরণের রূপ (এবং এর অংশ হিসাবে নির্ভরশীল ধরণের প্রকারগুলি) প্রোগ্রামিং ভাষা বিটা দ্বারা অনুপ্রাণিত হয়েছিল ... এগুলি স্বাভাবিকভাবেই বিটার ধারাবাহিক বাসা বাঁধার শব্দ থেকে উদ্ভূত হয়েছিল। আমি এই রূপটিতে নির্ভরশীল প্রকারের এমন কোনও নির্লজ্জ মূলধারার প্রোগ্রামিং ভাষা জানি না know কক, কেয়েন, এপিগ্রাম এবং আগদার মতো ভাষার নির্ভরশীল টাইপিংয়ের আলাদা রূপ রয়েছে যা কিছু দিক থেকে আরও সাধারণ, তবে এটি টাইপ সিস্টেমের অংশ হয়ে উল্লেখযোগ্যভাবে পৃথক হয় যা স্কালার বিপরীতে সাব টাইপিংয়ের মতো নয়।