কোনও ফাংশনের জন্য কোনও পরামিতি সংশোধন করা ঠিক আছে কি?


17

আমাদের কাছে একটি ডেটা স্তর রয়েছে যা লিনক থেকে এসকিউএল জড়িয়ে দেয়। এই ডেটালেয়ারে আমাদের এই পদ্ধতিটি রয়েছে (সরলীকৃত)

int InsertReport(Report report)
{
    db.Reports.InsertOnSubmit(report);
    db.SubmitChanges();
    return report.ID; 
}

পরিবর্তনগুলি জমা দেওয়ার সময়, রিপোর্ট আইডিটি ডাটাবেসের মান সহ আপডেট হয় যা আমরা তারপরে ফিরে আসি।

কলিং পাশ থেকে এটি দেখতে এরকম দেখাচ্ছে (সরলীকৃত)

var report = new Report();
DataLayer.InsertReport(report);
// Do something with report.ID

কোডটি দেখে, আইডিটি এক ধরণের পার্শ্ব প্রতিক্রিয়া হিসাবে InsertReport ফাংশনের অভ্যন্তরে সেট করা হয়েছে এবং তারপরে আমরা রিটার্নের মানটিকে অগ্রাহ্য করছি।

আমার প্রশ্নটি হল, আমি কি পার্শ্ব প্রতিক্রিয়ার উপর নির্ভর করব এবং পরিবর্তে এর মতো কিছু করব।

void InsertReport(Report report)
{
    db.Reports.InsertOnSubmit(report);
    db.SubmitChanges();
}

বা আমাদের এটি প্রতিরোধ করা উচিত

int InsertReport(Report report)
{
    var newReport = report.Clone();
    db.Reports.InsertOnSubmit(newReport);
    db.SubmitChanges();
    return newReport.ID; 
}

এমনকি এমনকি

Report InsertReport(Report report)
{
    var newReport = report.Clone();
    db.Reports.InsertOnSubmit(newReport);
    db.SubmitChanges();
    return newReport; 
}

এই প্রশ্নটি উত্থাপিত হয়েছিল যখন আমরা একটি ইউনিট পরীক্ষা তৈরি করেছি এবং দেখেছি যে রিপোর্টের প্যারামিটারগুলির আইডি সম্পত্তি আপডেট হবে এবং পার্শ্ব প্রতিক্রিয়ার আচরণকে উপহাস করার জন্য এটি সত্যই পরিষ্কার নয় যে আপনি যদি চান তবে একটি কোডের গন্ধ।


2
এটি এপিআই ডকুমেন্টেশন এর জন্য।

উত্তর:


16

হ্যাঁ, এটি ঠিক আছে, এবং মোটামুটি সাধারণ। এটি আপনি যেমন আবিষ্কার করেছেন ঠিক তেমন স্পষ্টতই এটি হতে পারে।

সাধারণভাবে, আমি দৃistence়তা-জাতীয় পদ্ধতিগুলির সাথে অবজেক্টের আপডেট হওয়া উদাহরণটি ফিরিয়ে আনতে চাইছি। এটাই:

Report InsertReport(Report report)
{        
    db.Reports.InsertOnSubmit(report);
    db.SubmitChanges();
    return report; 
}

হ্যাঁ, আপনি যেভাবে পাশ করেছেন সেই একই জিনিসটি আপনি ফিরিয়ে দিচ্ছেন, তবে এটি এপিআইকে আরও স্পষ্ট করে তোলে। ক্লোনটির কোনও প্রয়োজন নেই - যদি এমন কোনও কিছু ঘটে যা বিভ্রান্তি সৃষ্টি করে তবে যদি আপনার আসল কোড হিসাবে, কলার তাদের পাস করা অবজেক্টটি ব্যবহার করতে থাকে।

আর একটি বিকল্প ডিটিও ব্যবহার করা

Report InsertReport(ReportDTO dto)
{
    var newReport = Report.Create(dto);
    db.Reports.InsertOnSubmit(newReport);
    db.SubmitChanges();
    return newReport; 
}

এইভাবে এপিআই খুব সুস্পষ্ট, এবং কলার দুর্ঘটনাক্রমে পাস / ইন মডিফাইড অবজেক্টটি ব্যবহার এবং চেষ্টা করতে পারে না। আপনার কোডটি কী করছে তার উপর নির্ভর করে যদিও এটি কিছুটা ব্যথা হতে পারে।


ইরার দরকার না হলে আমি বস্তুটি ফেরত দেব না। অতিরিক্ত প্রক্রিয়াকরণ এবং মেমরির (ওভার) ব্যবহারের মতো দেখতে এগুলি। আমি যদি প্রয়োজন না হয় তবে শূন্যতা বা ব্যতিক্রমের জন্য যাই। অন্যথায়, আমি আপনার ডিটিও নমুনার জন্য ভোট দিয়েছি।
স্বতন্ত্র

এই সমস্ত উত্তর আমাদের নিজস্ব আলোচনার সমষ্টি। এটি সত্যিকারের কোনও উত্তর না দিয়েই একটি প্রশ্ন বলে মনে হচ্ছে। আপনার বিবৃতি "হ্যাঁ, আপনি যেভাবে পাশ করেছেন ঠিক একই জিনিসটি ফিরে আসছেন, তবে এটি এপিআইকে আরও পরিষ্কার করে তোলে।" বেশ আমাদের প্রশ্নের উত্তর।
জন পেট্রাক

4

আইএমও এটি একটি বিরল উদাহরণ যেখানে পরিবর্তনের পার্শ্ব প্রতিক্রিয়া আকাঙ্খিত - কারণ আপনার প্রতিবেদনের সত্তার একটি আইডি এটি ইতিমধ্যে একটি ডিটিওর উদ্বেগ হিসাবে ধরে নেওয়া যেতে পারে, এবং মেমরির প্রতিবেদনটি নিশ্চিত করার জন্য ওআরএমের বাধ্যবাধকতা রয়েছে সত্তা ডাটাবেস উপস্থাপনা অবজেক্টের সাথে একযোগে রাখা হয়।


6
+1 - ডিবিতে কোনও সত্তা সন্নিবেশ করার পরে আপনি এটির একটি আইডি রাখবেন বলে আশা করবেন । সত্তাটি এটি ছাড়া ফিরে এলে এটি আরও অবাক হওয়ার বিষয়।
ম্যাটডেভি

2

সমস্যাটি হ'ল ডকুমেন্টেশন ব্যতীত পদ্ধতিটি কী করছে এবং বিশেষত এটি কেন পূর্ণসংখ্যা ফেরত দিচ্ছে তা স্পষ্ট নয় not

সবচেয়ে সহজ সমাধান হ'ল আপনার পদ্ধতির জন্য আলাদা নাম ব্যবহার করা। কিছুটা এইরকম:

int GenerateIdAndInsert(Report report)

তবুও, এটি যথেষ্ট দ্ব্যর্থহীন নয়: যদি সি # এর মতো, reportঅবজেক্টের উদাহরণটি রেফারেন্স দিয়ে পাস করা হয় তবে এটি জানতে অসুবিধা হবে যে আসল reportবস্তুটি সংশোধিত হয়েছে কিনা, বা পদ্ধতিটি এটি ক্লোন করে কেবল ক্লোনটি সংশোধন করেছে কিনা। আপনি যদি আসল অবজেক্টটি সংশোধন করতে চান তবে পদ্ধতির নামকরণ করা ভাল:

void ChangeIdAndInsert(Report report)

আরও জটিল (এবং সম্ভবত কম অনুকূল) সমাধান হ'ল কোডটিকে ভারী রিফ্যাক্টর করা। কি সম্পর্কে:

using (var transaction = new TransactionScope())
{
    var id = this.Data.GenerateReportId(); // We need to find an available ID...
    this.Data.AddReportWithId(id, report); // ... and use this ID to insert a report.
    transaction.Complete();
}

2

সাধারণত প্রোগ্রামাররা আশা করে যে কেবল কোনও সামগ্রীর উদাহরণ পদ্ধতিগুলি তার স্থিতি পরিবর্তন করতে পারে। অন্য কথায়, আমি যদি report.insert()প্রতিবেদনের আইডি পরিবর্তন করে তবে আমি অবাক হই না এবং এটি পরীক্ষা করা সহজ। প্রতিবেদনের আইডি পরিবর্তন হয় বা না হলে পুরো প্রয়োগের প্রতিটি পদ্ধতির জন্য অবাক করা সহজ নয় easy

আমি আরও যুক্তি দিয়ে বলব যে সম্ভবত IDএটিরও অন্তর্ভুক্ত নয়Report । যেহেতু এটিতে এত দিন কোনও বৈধ আইডি থাকে না, তাই আপনার সন্নিবেশ করার আগে এবং পরে দুটি আলাদা আলাদা আলাদা আচরণ সহ সত্যই দুটি ভিন্ন অবজেক্ট থাকে। "পূর্বে" অবজেক্টটি সন্নিবেশ করা যেতে পারে তবে এটি পুনরুদ্ধার, আপডেট করা বা মোছা যায় না। "পরের" অবজেক্টটি হ'ল বিপরীত। একটির আইডি আছে এবং অন্যটির নেই। এগুলি প্রদর্শিত হওয়ার উপায়টি আলাদা হতে পারে। তারা প্রদর্শিত তালিকাগুলি আলাদা হতে পারে। সংযুক্ত ব্যবহারকারীর অনুমতি পৃথক হতে পারে। তারা উভয়ই শব্দের ইংরেজী অর্থে "প্রতিবেদন" তবে তারা খুব আলাদা।

অন্যদিকে, আপনার কোডটি যথেষ্ট সহজ হতে পারে যে একটি বস্তু যথেষ্ট হবে, তবে আপনার কোডটি পেপার করা হয়েছে কিনা তা বিবেচনা করার মতো if (validId) {...} else {...}


0

না এটা ঠিক নেই! কেবলমাত্র পদ্ধতিগত ভাষায় প্যারামিটারটি সংশোধন করার পদ্ধতিটি উপযুক্ত, যেখানে অন্য কোনও উপায় নেই; ওওপি ভাষাগুলিতে প্রতিবেদনের ক্ষেত্রে এই ক্ষেত্রে (পরিবর্তনের মতো কিছু।

এই ক্ষেত্রে আপনার পদ্ধতিটি 2 টি কাজ করে, সুতরাং এসআরপি ভেঙে দেয়: এটি ডিবিতে একটি রেকর্ড সন্নিবেশ করে এবং এটি একটি নতুন আইডি উত্পন্ন করে। কলকারী এটি জানতে সক্ষম নন যে আপনার পদ্ধতিটি একটি নতুন আইডিও জেনারেট করে যেহেতু একে কেবল ইনসেটরেকর্ড () বলা হয়।


3
এরম ... যদি db.Reports.InsertOnSubmit(report)বস্তুটির পরিবর্তনের পদ্ধতিটি কল করে?
স্টিফেন সি

এটি ঠিক আছে ... এড়ানো উচিত, তবে এই ক্ষেত্রে লিনকিউ থেকে এসকিউএল প্যারামিটার পরিবর্তন করছে যাতে এটি ওপরের মতো নয় যে হুপ জাম্পিং ক্লোন প্রভাব (এটি এসআরপি এর নিজস্ব লঙ্ঘন) ছাড়া এড়াতে পারে।
টেলাস্টিন

@ স্টেফেনসি আমি বলছিলাম যে প্রতিবেদনের অবজেক্টে আপনার সেই পদ্ধতিটি কল করা উচিত; এই ক্ষেত্রে পরামিতি হিসাবে একই বস্তুটি পাস করার কোনও অর্থ নেই।
m3th0dman

@ টেলাস্টিন আমি সাধারণ ক্ষেত্রে বলছিলাম; ভাল অভ্যাসগুলি 100% সম্মান করা যায় না। তার বিশেষ ক্ষেত্রে কেউ 5 লাইন কোডের সর্বোত্তম উপায় কোনটি অনুমান করতে পারে না ...
এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.