একক দায়িত্ব পুঁজি আপনার সেরা বন্ধু এখানে।
সবার আগে, AllFromCache () একটি সংগ্রহস্থল শ্রেণিতে সরান এবং এটিকে getAll () বলে। এটি ক্যাশে থেকে পুনরুদ্ধার করা সংগ্রহস্থলের একটি বাস্তবায়ন বিশদ এবং কলিং কোড দ্বারা জানা উচিত নয়।
এটি আপনার ফিল্টারিং ক্লাসটিকে টেস্ট করা দুর্দান্ত এবং সহজ করে তোলে। আপনি এটি কোথা থেকে পাচ্ছেন তা এখন আর চিন্তা করে না।
দ্বিতীয়ত, ক্যাচিংয়ের মোড়কে ক্লাসটি আবরণ করুন যা ডেটাবেস থেকে ডেটা (বা যেখানেই) পায়।
এওপি এটির জন্য একটি ভাল কৌশল। এটি এমন কয়েকটি জিনিসের একটি যা এটি খুব ভাল।
পোস্টশার্পের মতো সরঞ্জামগুলি ব্যবহার করে আপনি এটি সেট আপ করতে পারেন যাতে কোনও নির্বাচিত বৈশিষ্ট্যযুক্ত চিহ্নিত কোনও পদ্ধতি ক্যাশে যায়। তবে, যদি আপনি কেবল এই জিনিসটিই ক্যাচ করছেন তবে আপনাকে এওপি ফ্রেমওয়ার্কের যতদূর যেতে হবে না। কেবলমাত্র একটি রেপোজিটরি এবং একটি ক্যাচিং র্যাপার রয়েছে যা একই ইন্টারফেস ব্যবহার করে এবং কলিং ক্লাসে এটি ইনজেক্ট করে।
যেমন।
public class ProductManager
{
private IProductRepository ProductRepository { get; set; }
public ProductManager
{
ProductRepository = productRepository;
}
Product FetchById(guid id) { ... }
IList<Product> FilterByPropertry(int property) { ... }
}
public interface IProductRepository
{
IList<Product> GetAll();
}
public class SqlProductRepository : IProductRepository
{
public IList<Product> GetAll()
{
// DB Connection, fetch
}
}
public class CachedProductRepository : IProductRepository
{
private IProductRepository ProductRepository { get; set; }
public CachedProductRepository (IProductRepository productRepository)
{
ProductRepository = productRepository;
}
public IList<Product> GetAll()
{
// Check cache, if exists then return,
// if not then call GetAll() on inner repository
}
}
আপনি কীভাবে প্রোডাক্ট ম্যানেজার থেকে সংগ্রহস্থল বাস্তবায়ন জ্ঞান সরিয়েছেন? আপনি কীভাবে একক দায়বদ্ধতার নীতিমালাকে মান্য করেছেন এমন এক ক্লাস যা ডেটা উত্তোলন পরিচালনা করে, এমন একটি শ্রেণি যা ডেটা পুনরুদ্ধার পরিচালনা করে এবং একটি শ্রেণি যা ক্যাশে পরিচালনা করে?
আপনি এখন সেই রিপোজিটরিগুলির মধ্যে যে কোনওটির সাথে প্রোডাক্ট ম্যানেজারটি ইনস্ট্যান্ট করতে পারেন এবং ক্যাচিং পেতে পারেন ... না not পরে এটি অবিশ্বাস্যরূপে কার্যকর যখন আপনি একটি বিভ্রান্তিকর বাগ পান যা আপনার সন্দেহ হয় যে ক্যাশের ফলাফল।
productManager = new ProductManager(
new SqlProductRepository()
);
productManager = new ProductManager(
new CachedProductRepository(new SqlProductRepository())
);
(আপনি যদি কোনও আইওসি পাত্রে ব্যবহার করেন তবে আরও ভাল how কীভাবে মানিয়ে নেবেন তা স্পষ্ট হওয়া উচিত))
এবং, আপনার প্রোডাক্ট ম্যানেজার পরীক্ষায়
IProductRepository repo = MockRepository.GenerateStrictMock<IProductRepository>();
একেবারে ক্যাশে পরীক্ষা করার দরকার নেই।
এখন প্রশ্নটি হয়ে ওঠে: আমি কি সেই ক্যাশেড প্রোডাক্টরেপোজিটরিটি পরীক্ষা করব? আমার পরামর্শ নেই। ক্যাশেটি বেশ অনিশ্চিত। ফ্রেমওয়ার্কটি এমন কিছু করে যা আপনার নিয়ন্ত্রণের বাইরে থাকে। পছন্দ করুন, উদাহরণস্বরূপ, যখন এটি খুব পূর্ণ হয়ে যায় তখন এটিকে থেকে কেবল সরান। আপনি এমন পরীক্ষাগুলি শেষ করতে যাচ্ছেন যা একবার নীল চাঁদে ব্যর্থ হয় এবং আপনি কেন কখনই বুঝতে পারবেন না।
এবং, আমি উপরে প্রস্তাবিত পরিবর্তনগুলি করেছি, সেখানে পরীক্ষা করার মতো এত যুক্তি নেই really সত্যই গুরুত্বপূর্ণ পরীক্ষা, ফিল্টারিং পদ্ধতিটি সেখানে থাকবে এবং গেটএল () এর বিশদ থেকে সম্পূর্ণ বিমূর্ত হবে। গেটএল () ঠিক ... সবই পেয়েছে। কোথাও থেকে.