হ্যাঁ, অ্যাপ্লিকেশন কোডে হার্ড কোডিং এসকিউএল স্ট্রিংগুলি সাধারণত একটি অ্যান্টি-প্যাটার্ন।
আসুন আমরা উত্পাদন কোডে এটি দেখার বছর থেকে আমরা যে সহনশীলতা বিকাশ করেছি সেটাকে সরিয়ে রাখার চেষ্টা করি। একই ফাইলে বিভিন্ন সিনট্যাক্সের সাথে সম্পূর্ণ ভিন্ন ভাষা মিশ্রিত করা সাধারণত কোনও কাঙ্ক্ষিত বিকাশের কৌশল নয়। এটি রেজারের মতো টেম্পলেট ভাষার চেয়ে পৃথক যা একাধিক ভাষায় প্রাসঙ্গিক অর্থ দেওয়ার জন্য ডিজাইন করা হয়েছে। যেমন সাভা বি নীচে একটি মন্তব্যে উল্লেখ করেছেন, আপনার সি # বা অন্যান্য অ্যাপ্লিকেশন ভাষার এসকিউএল (পাইথন, সি ++ ইত্যাদি) অন্য যেগুলির মতো একটি স্ট্রিং এবং শব্দার্থগত অর্থহীন। বেশিরভাগ ক্ষেত্রে একাধিক ভাষার মিশ্রণের ক্ষেত্রেও একই কথা প্রযোজ্য, যদিও এমন পরিস্থিতিতে স্পষ্টতই পরিস্থিতি রয়েছে যেখানে এটি গ্রহণযোগ্যতা রয়েছে, যেমন এইচটিএমএল-এ সিএসএল-এর ছোট এবং বোধগম্য স্নিপেটগুলি (উল্লেখ করে যে সিএসএস এইচটিএমএল মিশ্রিত করার জন্য ডিজাইন করা হয়েছে) ), এবং অন্যদের.
(রবার্ট সি মার্টিন মিশ্রণ সম্পর্কিত ভাষাগুলি, ক্লিন কোড , অধ্যায় 17, "কোডের গন্ধ এবং হিউরিস্টিকস" পৃষ্ঠা 288)
এই প্রতিক্রিয়াটির জন্য, আমি এসকিউএল (প্রশ্নে জিজ্ঞাসা করা) হিসাবে ফোকাস করব। এসকিউএলকে বিযুক্ত স্ট্রিংয়ের একটি car লা কার্ট সেট হিসাবে সংরক্ষণ করার সময় নিম্নলিখিত সমস্যাগুলি দেখা দিতে পারে:
- ডেটাবেস যুক্তি সনাক্ত করা কঠিন। আপনার সমস্ত এসকিউএল বিবৃতি পেতে আপনি কী অনুসন্ধান করছেন? "নির্বাচন", "আপডেট", "মার্জ", ইত্যাদি সহ স্ট্রিংগুলি?
- একই বা অনুরূপ এসকিউএল এর রিফ্যাক্টরিং ব্যবহারগুলি কঠিন হয়ে পড়ে।
- অন্যান্য ডাটাবেসের জন্য সমর্থন যুক্ত করা কঠিন। কেউ কীভাবে এটি সম্পাদন করবে? প্রতিটি ডাটাবেসের জন্য বিবৃতি যুক্ত করুন এবং পদ্ধতিটিতে স্ট্রিং হিসাবে সমস্ত প্রশ্নগুলি সংরক্ষণ করুন?
- বিকাশকারীরা অন্য ভাষায় একটি বিবৃতি পড়েন এবং পদ্ধতির উদ্দেশ্য থেকে পদ্ধতির প্রয়োগের বিশদগুলিতে (কীভাবে এবং কোথা থেকে ডেটা পুনরুদ্ধার করা হয়) ফোকাসে স্থানান্তরিত হয়ে বিভ্রান্ত হন।
- ওয়ান-লাইনারগুলির সমস্যা খুব বেশি নাও হতে পারে, তবে বিবৃতি আরও জটিল হওয়ার সাথে সাথে ইনলাইন এসকিউএল স্ট্রিংগুলি পৃথক্ভাবে পড়তে শুরু করে। আপনি 113 লাইনের স্টেটমেন্ট দিয়ে কী করবেন? আপনার পদ্ধতিতে 113 টি লাইন রাখবেন?
- বিকাশকারী কীভাবে দক্ষতার সাথে তাদের এসকিউএল সম্পাদক (এসএসএমএস, এসকিউএল বিকাশকারী, ইত্যাদি) এবং তাদের উত্স কোডের মধ্যে কোয়েরিগুলি পিছনে পিছনে সরান? সি # এর
@
উপসর্গটি এটিকে আরও সহজ করে তোলে তবে আমি প্রচুর কোড দেখেছি যা প্রতিটি এসকিউএল লাইন উদ্ধৃত করে এবং নতুন লাইনগুলি থেকে বেরিয়ে যায়।
"SELECT col1, col2...colN"\
"FROM painfulExample"\
"WHERE maintainability IS NULL"\
"AND modification.effort > @necessary"\
- পার্শ্ববর্তী অ্যাপ্লিকেশন কোড সহ এসকিউএল প্রান্তিককরণের জন্য ব্যবহৃত ইনডেন্টেশন অক্ষরগুলি প্রতিটি সম্পাদনকারীর মাধ্যমে নেটওয়ার্কের মাধ্যমে প্রেরণ করা হয়। এটি সম্ভবত ছোট স্কেল অ্যাপ্লিকেশনগুলির জন্য তুচ্ছ, তবে সফ্টওয়্যারটির ব্যবহার বাড়ার সাথে সাথে এটি যুক্ত হতে পারে।
পূর্ণ ORMs (সত্তা ফ্রেমওয়ার্ক বা হাইবারনেটের মতো অবজেক্ট-রিলেশনাল ম্যাপারস) অ্যাপ্লিকেশন কোডে এলোমেলোভাবে পেপার্ড এসকিউএলকে মুছে ফেলতে পারে। আমার এসকিউএল এবং রিসোর্স ফাইলগুলির ব্যবহার কেবল উদাহরণ। ওআরএম, সহায়ক সহায়ক ক্লাস ইত্যাদি সমস্ত ক্লিনার কোডের লক্ষ্য অর্জনে সহায়তা করতে পারে।
কেভিন যেমন পূর্বের উত্তরে বলেছিলেন, কোডে এসকিউএল ছোট প্রকল্পগুলিতে গ্রহণযোগ্য হতে পারে তবে বড় প্রকল্পগুলি ছোট প্রকল্প হিসাবে শুরু হয় এবং বেশিরভাগ দলগুলি ফিরে যেতে পারে এবং এটি সঠিকভাবে করার সম্ভাবনাটি কোডের আকারের সাথে বিপরীতভাবে আনুপাতিক হয়।
কোনও প্রকল্পে এসকিউএল রাখার অনেকগুলি সহজ উপায় রয়েছে। আমি যে পদ্ধতিগুলি প্রায়শই ব্যবহার করি তার মধ্যে একটি হ'ল প্রতিটি এসকিউএল বিবৃতিটি একটি ভিজ্যুয়াল স্টুডিও রিসোর্স ফাইলে রাখা হয়, সাধারণত নামটি "এসকিউএল"। আপনার সরঞ্জামগুলির উপর নির্ভর করে একটি পাঠ্য ফাইল, জেএসএন নথি বা অন্যান্য ডেটা উত্স যুক্তিসঙ্গত হতে পারে। কিছু ক্ষেত্রে, এসকিউএল স্ট্রিংগুলি এনকোনসিংয়ের জন্য উত্সর্গীকৃত একটি পৃথক শ্রেণি সেরা বিকল্প হতে পারে তবে উপরে বর্ণিত কিছু সমস্যা থাকতে পারে।
এসকিউএল উদাহরণ: কোনটি আরও মার্জিত দেখাচ্ছে ?:
using(DbConnection connection = Database.SystemConnection()) {
var eyesoreSql = @"
SELECT
Viewable.ViewId,
Viewable.HelpText,
PageSize.Width,
PageSize.Height,
Layout.CSSClass,
PaginationType.GroupingText
FROM Viewable
LEFT JOIN PageSize
ON PageSize.Id = Viewable.PageSizeId
LEFT JOIN Layout
ON Layout.Id = Viewable.LayoutId
LEFT JOIN Theme
ON Theme.Id = Viewable.ThemeId
LEFT JOIN PaginationType
ON PaginationType.Id = Viewable.PaginationTypeId
LEFT JOIN PaginationMenu
ON PaginationMenu.Id = Viewable.PaginationMenuId
WHERE Viewable.Id = @Id
";
var results = connection.Query<int>(eyesoreSql, new { Id });
}
হয়ে
using(DbConnection connection = Database.SystemConnection()) {
var results = connection.Query<int>(sql.GetViewable, new { Id });
}
এসকিউএল সর্বদা একটি সন্ধানের জন্য সহজ ফাইল বা ফাইলগুলির গোষ্ঠীভুক্ত সেটগুলিতে থাকে, প্রত্যেকের বর্ণনামূলক নাম থাকে যা এটি কীভাবে এটি করে তার পরিবর্তে এটি কী করে তা বর্ণনা করে, প্রতিটি মন্তব্যের জন্য স্থান রয়েছে যা অ্যাপ্লিকেশন কোডের প্রবাহকে বাধাগ্রস্ত করবে না each :
এই সহজ পদ্ধতিটি একটি নির্জন জিজ্ঞাসা চালায়। আমার অভিজ্ঞতায়, "বিদেশী ভাষা" ব্যবহারের ফলে সুবিধাটি আরও বেশি পরিশীলিত হয়।
আমার একটি রিসোর্স ফাইলের ব্যবহার কেবল উদাহরণ। ভাষা (এই ক্ষেত্রে এসকিউএল) এবং প্ল্যাটফর্মের উপর নির্ভর করে বিভিন্ন পদ্ধতি আরও উপযুক্ত হতে পারে।
এই এবং অন্যান্য পদ্ধতিগুলি নিম্নলিখিত পদ্ধতিতে উপরে তালিকাটি সমাধান করে:
- ডাটাবেস কোডটি সনাক্ত করা সহজ কারণ এটি ইতিমধ্যে কেন্দ্রিয়ায়িত। বড় প্রকল্পগুলিতে, এসকিউএল-এর মতো পৃথক ফাইলগুলিতে গ্রুপ তৈরি করুন, সম্ভবত নামকৃত ফোল্ডারের নিচে
SQL
।
- দ্বিতীয়, তৃতীয়, ইত্যাদি ডাটাবেসের জন্য সমর্থন সহজ। একটি ইন্টারফেস (বা অন্য ভাষা বিমূর্তি) তৈরি করুন যা প্রতিটি ডাটাবেসের অনন্য বিবৃতি দেয়। প্রতিটি ডাটাবেসের জন্য বাস্তবায়ন অনুরূপ বিবৃতিগুলির তুলনায় কিছুটা বেশি হয়ে যায়:
return SqlResource.DoTheThing;
সত্য, এই বাস্তবায়নগুলি রিসোর্সটি এড়িয়ে যেতে পারে এবং এসকিউএলকে স্ট্রিংয়ে অন্তর্ভুক্ত করতে পারে, তবে উপরের কিছু (সমস্ত নয়) সমস্যাগুলি এখনও তলিয়ে যাবে।
- রিফ্যাক্টরিং সহজ - কেবল একই সংস্থানটি পুনরায় ব্যবহার করুন। এমনকি আপনি বিভিন্ন ফর্ম্যাট স্টেটমেন্টের সাথে বিভিন্ন সময় বিভিন্ন ডিবিএমএস সিস্টেমের জন্য একই রিসোর্স এন্ট্রি ব্যবহার করতে পারেন। আমি প্রায়শই এটি করি।
- মাধ্যমিক ভাষার ব্যবহার বর্ণনামূলক নামগুলি ব্যবহার করতে পারে উদাহরণস্বরূপ
sql.GetOrdersForAccount
আরও অবস্হানির চেয়েSELECT ... FROM ... WHERE...
- এসকিউএল স্টেটমেন্টগুলির আকার এবং জটিলতা নির্বিশেষে একটি লাইনের সাথে তলব করা হয়।
- এসকিউএলকে এসএসএমএস এবং এসকিউএল বিকাশকারীর মতো ডেটাবেস সরঞ্জামগুলির মধ্যে কোনও সংশোধন বা সাবধানতার সাথে অনুলিপি করে অনুলিপি এবং আটকানো যায়। কোন উদ্ধৃতি চিহ্ন নেই। পিছনে পিছনে নেই। বিশেষত ভিজ্যুয়াল স্টুডিও রিসোর্স এডিটরের ক্ষেত্রে, একটি ক্লিক এসকিউএল বিবৃতি হাইলাইট করে। CTRL + C এবং তারপরে এটি এসকিউএল সম্পাদকটিতে আটকান।
কোনও উত্সে এসকিউএল তৈরি করা দ্রুত, সুতরাং এসকিউএল-ইন-কোডের সাথে সংস্থান ব্যবহারের মিশ্রণ করার খুব কম গতি নেই।
নির্বাচিত পদ্ধতি নির্বিশেষে, আমি খুঁজে পেয়েছি যে ভাষার মিশ্রণ সাধারণত কোডের মান হ্রাস করে। আমি আশা করি যে এখানে বর্ণিত কিছু সমস্যা এবং সমাধান বিকাশকারীদের উপযুক্ত হলে এই কোডের গন্ধ দূর করতে সহায়তা করে।