গত কয়েক বছর ধরে, আমরা আস্তে আস্তে উন্নততর লিখিত কোডে স্যুইচ ওভার করছি, একসাথে কয়েকটি শিশুর পদক্ষেপ। আমরা অবশেষে এমন কিছুতে স্যুইচটিকে শুরু করতে শুরু করি যা কমপক্ষে সলাইডের অনুরূপ, তবে আমরা এখনও সেখানে আছি না। স্যুইচটি তৈরি করার পরে, বিকাশকারীদের কাছ থেকে সবচেয়ে বড় অভিযোগ হ'ল তারা পিয়ার পর্যালোচনা এবং কয়েক ডজন এবং কয়েক ডজন ফাইল ট্র্যাভার করে দাঁড়াতে পারবেন না যেখানে আগে প্রতিটি কার্যেই কেবল বিকাশকারীকে 5-10 ফাইল স্পর্শ করা প্রয়োজন।
স্যুইচ করা শুরু করার আগে, আমাদের আর্কিটেকচারটি নীচের মতো বেশ সুসজ্জিতভাবে সাজানো হয়েছিল (আরও দুটি ফাইলের আকারের দুটি বা দুটি অর্ডার দিয়ে দেওয়া হয়েছে):
Solution
- Business
-- AccountLogic
-- DocumentLogic
-- UsersLogic
- Entities (Database entities)
- Models (Domain Models)
- Repositories
-- AccountRepo
-- DocumentRepo
-- UserRepo
- ViewModels
-- AccountViewModel
-- DocumentViewModel
-- UserViewModel
- UI
ফাইল অনুসারে, সবকিছু অবিশ্বাস্যভাবে রৈখিক এবং কমপ্যাক্ট ছিল। স্পষ্টতই প্রচুর কোড-ডুপ্লিকেশন, টাইট-কাপলিং এবং মাথাব্যাথা ছিল, তবে প্রত্যেকে এটিকে পেরিয়ে বের করতে পেরেছিল। সম্পূর্ণ নবীনদের, ভিজ্যুয়াল স্টুডিও হিসাবে খোলার মতো লোকেরা কখনও এগুলিকে আবিষ্কার করতে পারে মাত্র কয়েক সপ্তাহের মধ্যে। সামগ্রিক ফাইল জটিলতার অভাব নবীন বিকাশকারীদের এবং নতুন ভাড়ার জন্য খুব বেশি সময় র্যাম আপ ছাড়াই অবদান শুরু করা তুলনামূলকভাবে সহজ করে তোলে। তবে এটি বেশ অনেকটা যেখানে কোড শৈলীর কোনও সুবিধা উইন্ডোটির বাইরে চলে যায়।
আমি আমাদের কোডবেসকে আরও উন্নত করার জন্য আমাদের প্রতিটি প্রয়াসকে আন্তরিকভাবে সমর্থন করি তবে এটির মতো বিশাল দৃষ্টান্তের শিফটে দলের বাকি সদস্যদের থেকে কিছুটা পুশ-ব্যাক পাওয়া খুব সাধারণ বিষয়। বর্তমানে সবচেয়ে বড় স্টিকিং পয়েন্টগুলির মধ্যে কয়েকটি:
- ইউনিট টেস্ট
- ক্লাস গণনা
- পিয়ার রিভিউ জটিলতা
ইউনিট পরীক্ষাগুলি দলে একটি অবিশ্বাস্যভাবে কঠোর বিক্রয় হয়েছে কারণ তারা সকলেই বিশ্বাস করে যে তারা সময় নষ্ট করে এবং তারা পৃথকভাবে প্রতিটি টুকরো থেকে পুরোপুরি তাদের কোডটি হ্যান্ডেল-টেস্ট করতে সক্ষম। সলিডের পক্ষে প্রস্তাব হিসাবে ইউনিট পরীক্ষাগুলি ব্যবহার করা বেশিরভাগ ক্ষেত্রে নিরর্থক এবং বেশিরভাগ সময়েই এটি একটি রসিকতায় পরিণত হয়েছে।
ক্লাস গণনা সম্ভবত একমাত্র বৃহত্তম বাধা অতিক্রম করতে পারে। যে টাস্কগুলিতে 5-10 ফাইল নেওয়া হত এখন 70-100 লাগতে পারে! এই ফাইলগুলির প্রত্যেকটি পৃথক উদ্দেশ্যে পরিবেশন করার সময়, ফাইলগুলির নিছক ভলিউম অপ্রতিরোধ্য হতে পারে। দলটির প্রতিক্রিয়া বেশিরভাগই কর্ণপাত এবং মাথা চুলকানো ছিল। পূর্বে কোনও কাজের জন্য এক বা দুটি সংগ্রহস্থল, একটি মডেল বা দুটি, একটি লজিক স্তর এবং একটি নিয়ামক পদ্ধতি থাকতে পারে required
এখন, একটি সরল ফাইল সেভিং অ্যাপ্লিকেশন তৈরি করতে আপনার ফাইলটি ইতিমধ্যে উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য একটি ক্লাস রয়েছে, মেটাডেটা লেখার জন্য একটি ক্লাস, বিমূর্ত করার জন্য একটি শ্রেণি DateTime.Now
যাতে আপনি ইউনিট পরীক্ষার জন্য সময় ইনজেকশন করতে পারেন, যুক্তিযুক্ত ফাইলগুলির প্রতিটি ফাইলের জন্য ইন্টারফেস, ফাইলগুলি সেখানে প্রতিটি ক্লাসের ইউনিট পরীক্ষা এবং আপনার ডিআই কনটেইনে সমস্ত কিছু যুক্ত করার জন্য এক বা একাধিক ফাইল রয়েছে।
ছোট থেকে মাঝারি আকারের অ্যাপ্লিকেশনগুলির জন্য, সলাইড একটি সুপার ইজি বিক্রয়। প্রত্যেকে বেনিফিট এবং রক্ষণাবেক্ষণের স্বাচ্ছন্দ্য দেখায়। তবে, তারা খুব বড় আকারের অ্যাপ্লিকেশনগুলিতে সলাইডের জন্য ভাল মানের প্রস্তাব দেখছে না। সুতরাং আমরা আমাদের ক্রমবর্ধমান যন্ত্রণাগুলি কাটিয়ে উঠতে সংগঠন ও পরিচালনার উন্নতির উপায়গুলি অনুসন্ধান করার চেষ্টা করছি।
আমি অনুভব করেছি যে আমি সম্প্রতি সম্পন্ন টাস্কটির উপর ভিত্তি করে ফাইলের ভলিউমের একটি উদাহরণ দিয়ে কিছুটা শক্তিশালী করব। আমাকে একটি ফাইল সিঙ্ক অনুরোধ পাওয়ার জন্য আমাদের নতুন মাইক্রোসার্ভেসিসে কিছু কার্যকারিতা বাস্তবায়নের জন্য একটি কার্য দেওয়া হয়েছিল। অনুরোধটি গ্রহণ করা হলে, পরিষেবাটি একাধিক অনুসন্ধান এবং চেকগুলি সম্পাদন করে এবং শেষ পর্যন্ত নথিটি একটি নেটওয়ার্ক ড্রাইভে সংরক্ষণ করে, পাশাপাশি 2 টি পৃথক ডাটাবেস সারণী।
নেটওয়ার্ক ড্রাইভে ডকুমেন্টটি সংরক্ষণ করতে আমার কয়েকটি নির্দিষ্ট ক্লাসের প্রয়োজন:
- IBasePathProvider
-- string GetBasePath() // returns the network path to store files
-- string GetPatientFolderName() // gets the name of the folder where patient files are stored
- BasePathProvider // provides an implementation of IBasePathProvider
- BasePathProviderTests // ensures we're getting what we expect
- IUniqueFilenameProvider
-- string GetFilename(string path, string fileType);
- UniqueFilenameProvider // performs some filesystem lookups to get a unique filename
- UniqueFilenameProviderTests
- INewGuidProvider // allows me to inject guids to simulate collisions during unit tests
-- Guid NewGuid()
- NewGuidProvider
- NewGuidProviderTests
- IFileExtensionCombiner // requests may come in a variety of ways, need to ensure extensions are properly appended.
- FileExtensionCombiner
- FileExtensionCombinerTests
- IPatientFileWriter
-- Task SaveFileAsync(string path, byte[] file, string fileType)
-- Task SaveFileAsync(FilePushRequest request)
- PatientFileWriter
- PatientFileWriterTests
সুতরাং মোট 15 টি ক্লাস (পিওসিও এবং স্ক্যাফোल्डিং বাদে) মোটামুটি সরল সাফল্য সঞ্চালনের জন্য। এই সংখ্যাটি উল্লেখযোগ্যভাবে বেলুন করা যখন আমার কয়েকটি সিস্টেমে সত্তার প্রতিনিধিত্ব করার জন্য পোকো তৈরি করার প্রয়োজন হয়েছিল, তৃতীয় পক্ষের সিস্টেমগুলির সাথে যোগাযোগের জন্য কয়েকটি রেপো তৈরি করা হয়েছিল যা আমাদের অন্যান্য ওআরএমের সাথে অসামঞ্জস্যপূর্ণ এবং কিছু ক্রিয়াকলাপের জটিলতাগুলি পরিচালনা করতে লজিক পদ্ধতি তৈরি করেছিল।