আপনার মডেলটিতে "ফুলনাম" বা "ফর্ম্যাটডফোন নাম্বার" এর মতো গিটারগুলি রাখা কি "প্যাটার্নের গন্ধ"?


13

আমি একটি এএসপি.এনইটি এমভিসি অ্যাপে কাজ করছি এবং আমি আমার মডেল / সত্তা ক্লাসগুলিতে সহায়ক এবং সুবিধাজনক উপার্জনকারীদের মতো লাগার অভ্যাসে চলে আসছি।

উদাহরণ স্বরূপ:

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }

    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }

    public string FormattedPhoneNumber
    {
        get { return "(" + PhoneNumber.Substring(0, 3) + ") " + PhoneNumber.Substring(3, 3) + "-" + PhoneNumber.Substring(6); }
    }
}

আমি অবাক হয়ে যাচ্ছি লোকেরা FullNameএবং FormattedPhoneNumberআগতদের সম্পর্কে চিন্তা করে ।

তারা অ্যাপ্লিকেশন জুড়ে মানসম্মত ডেটা ফর্ম্যাটগুলি তৈরি করা খুব সহজ করে তোলে এবং তারা প্রচুর পুনরাবৃত্তি কোড সংরক্ষণ করে বলে মনে হয় তবে এটি অবশ্যই যুক্তিযুক্ত হতে পারে যে ডেটা ফর্ম্যাট এমন একটি জিনিস যা মডেল থেকে ভিউ-মডেলকে ম্যাপিংয়ে পরিচালনা করা উচিত।

প্রকৃতপক্ষে, আমি মূলত এই পরিষেবা ফর্ম্যাটগুলিকে আমার পরিষেবা স্তরে প্রয়োগ করছি যেখানে আমি আমার ম্যাপিং করি তবে এটি নিয়মিতভাবে ফরম্যাটারগুলি লিখতে হবে এবং সেগুলি বিভিন্ন স্থানে প্রয়োগ করার জন্য বোঝা হয়ে উঠছিল। উদাহরণস্বরূপ, আমি বেশিরভাগ দর্শনগুলিতে "পুরো নাম" ব্যবহার করি এবং model.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName);পুরো জায়গার মতো কিছু টাইপ করা কেবল টাইপিংয়ের চেয়ে অনেক কম মার্জিত বলে মনে হয় model.FullName = entity.FullName(বা, যদি আপনি অটোম্যাপারের মতো কিছু ব্যবহার করেন, সম্ভাব্যত কোনও কিছুই টাইপ না করেন)।

সুতরাং, ডাটা ফর্ম্যাটিংয়ের ক্ষেত্রে আপনি লাইনটি কোথায় আঁকেন। আপনার মডেলটিতে ডেটা ফর্ম্যাটিং করা কি "ঠিক আছে" বা এটি "প্যাটার্নের গন্ধ"?

দ্রষ্টব্য: আমার মডেলটিতে আমার অবশ্যই কোনও এইচটিএমএল নেই। আমি তার জন্য এইচটিএমএল সহায়ক ব্যবহার করি। আমি কঠোরভাবে ডেটা ফর্ম্যাট করা বা একত্রিত করার বিষয়ে কথা বলছি (এবং বিশেষত ডেটা যা প্রায়শই ব্যবহৃত হয়)।


1
এটি করা সুবিধাজনক হতে পারে। তবে আশা করুন এবং প্রার্থনা করুন যে আপনাকে কখনই সেই কোডটি আন্তর্জাতিকীকরণ করতে হবে না।
বুটিলি

@ তবে, ভালো কথা, তবে আমি প্রায় 99.99% আত্মবিশ্বাসী যে আমি তা করব না।
ডিভাক্সার

সম্পূর্ণ নাম এবং ফোন নাম্বারের জন্য নির্দিষ্ট, অবশ্যই। প্রশ্নগুলি বিশেষত তাদের সম্পর্কে কারণ তাদের বিভিন্ন সংস্কৃতিতে অসামঞ্জস্যপূর্ণ ফর্ম্যাট রয়েছে বা @ ড্যানম কেবল এমন উদাহরণগুলি বেছে নিয়েছে যা আরও সাধারণ প্রশ্নের জন্য আন্তর্জাতিকভাবে উন্নত হয় না?
গ্রেগ জ্যাকসন

@ গ্রেগ জ্যাকসন, অবশ্যই মই। AmmoQ হিসাবে উল্লেখ করা হয়েছে, PhoneNumberসম্ভবত এটি নিজস্ব শ্রেণিতে অন্তর্ভুক্ত (যা আমি এখন বাস্তবায়ন করেছি)। তবে FullNameআসলেই কি আমাকে প্রশ্ন লিখতে উদ্বুদ্ধ করেছিল। তবে আমি সাধারণভাবে ডেটা ফর্ম্যাটিং / কম্বিং ইত্যাদির জন্য মডেলটিতে অ্যাপ্লিকেশন প্রয়োগ করতে সক্ষম হবে কি না তা খুঁজে পেতে আগ্রহী। নীচের উত্তরগুলি থেকে দেখে মনে হচ্ছে এটি কোনও বিরোধী-নিদর্শন নয়, তবে সিদ্ধান্তটি সাবধানতার সাথে নেওয়া উচিত।
ডেভুসার

মনে রাখবেন যে পুরো নামের জন্য এই নির্দিষ্ট ফর্ম্যাটিংটি ভালভাবে আন্তর্জাতিকীকরণ নাও করতে পারে। পূর্ব এশিয়ায়, উদাহরণস্বরূপ, নামের ক্রমটি পশ্চিমা বিশ্বে উল্টো। আপনার কি সত্যিই এটিকে সুস্পষ্টভাবে পরিচালনা করতে হবে? নাও হতে পারে, তবে কেবল মনে রাখবেন যে ডেটা ফর্ম্যাট করার সময় আপনার কাছে প্রচুর কৌতুকপূর্ণ জিনিস আসবে।
গ্রেগ জ্যাকসন

উত্তর:


9

আপনার উদাহরণস্বরূপ, আমি প্রাপ্তিটি পছন্দ করি FullName(আপনি যে সমস্ত কারণে দিয়েছেন) তবে আমি ফর্ম্যাটফোনবার নম্বরটি পছন্দ করি না। কারণটি হ'ল: সম্ভবত এটি এতটা সহজ নয় (একবার যদি আপনার কাছে আন্তর্জাতিক ফোন নম্বর ইত্যাদি থাকে) এবং যদি আপনি কোনও পদ্ধতিতে ফোন নম্বর গঠনের জন্য যুক্তি রাখেন Member, তবে একবার আপনার রিফ্যাক্টর (বা কপি-পেস্ট কাক ) করার দরকার হবে you একটি Formated ফোন নম্বর প্রয়োজন Institution, Vendorইত্যাদি খুব।

সম্পাদনা করুন: আইএমও এটা ভাল হবে একটি আছে PhoneNumberএকটি সঙ্গে বর্গ Formattedসংগ্রহকারী।


+1 এবং ধন্যবাদ তবে যদি আমি আসলে আমার ফোন নম্বর বিন্যাস কোডটি কোনও এক্সটেনশন পদ্ধতিতে রাখি তবে কী হবে? তারপরে যে কোনও মডেল এটি ব্যবহার করতে পারে এবং কোনও রিফ্যাক্টরিং বা অনুলিপি / আটকানো থাকবে না। এই দ্রষ্টব্যটি প্রতিটি ভিউতে প্রদর্শিত প্রতিটি ফোন নম্বরে ফর্ম্যাটার প্রয়োগ করার চেয়ে আরও একবারে কম পুনরাবৃত্তি হতে পারে।
ডেভুসার

3
তার জন্য একটি এক্সটেনশন পদ্ধতি ব্যবহার করা "ফাংশনাল পচন" অ্যান্টিপ্যাটার্নের দ্রুত উপায় হবে। একটি বর্ধিত পদ্ধতি ব্যবহার করে ( Stringক্লাসের জন্য, আমি ধরে নিই), আপনি Stringকীভাবে ফোন নম্বরগুলি ফর্ম্যাট করবেন সেই ক্লাসটি "শেখান" । Stringফোন নম্বর সম্পর্কে জানার বিষয়টি কি আসলে ক্লাসের দায়িত্ব ? আমি তাই মনে করি না. এর মতো ব্যবহৃত হয়, এক্সটেনশন পদ্ধতিগুলি এমন কোনও বিষয়কে পরিষ্কারভাবে অবজেক্ট ওরিয়েন্টেড না দেখানোর জন্য সিনট্যাক্টিকাল চিনি।
ব্যবহারকারী 281377

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

1
এবং আমি একটি PhoneNumberক্লাস ধারণা মত না । আমি যেভাবেই হোক তা করার পরিকল্পনা করছি কারণ আমারও একটি PhoneTypeসম্পত্তি আছে।
ডেভুসার

আমি PhoneNumberউদাহরণ ক্লাস হিসাবে থাকার ধারণা পছন্দ করি না কারণ ডেটা স্থানীয়ভাবে string। বরং এটির মতো পদ্ধতিগুলির সাথে একটি স্ট্যাটিক শ্রেণি হওয়া উচিত public static string Format(string phoneNumber, PhoneNumberStyle style)
মিঃ অ্যান্ডারসন

5

কোড লেখার সময় আপনার যে বিষয়গুলি বিবেচনা করা উচিত: এটি কি সঠিক? এটা কি পাঠযোগ্য? এটা দক্ষ? এটা কি রক্ষণাবেক্ষণযোগ্য? @ বিতর্কিত হিসাবে আমি যুক্তি দিয়ে বলব, সংস্কৃতি-নির্দিষ্ট ফর্ম্যাটের কারণে এটি রক্ষণাবেক্ষণযোগ্য নয়, তবে প্রশ্নটি আরও সাধারণ বলে মনে হচ্ছে।

এই জাতীয় অ্যাকসেসরগুলি ব্যবহার করা আপনার কোডটিকে আরও পঠনযোগ্য করে তোলে এবং আপনি কীভাবে এটি ব্যবহার করেন তার উপর নির্ভর করে আপনার কোডের অন্যান্য অংশগুলিকে আরও পরিষ্কার করতে পারে। আমার মতে, এটি মোটেই গন্ধ পায় না। আপনি মুদ্রণ করতে চাইলে যে কোনও ধরণের স্ট্রিংয়ের ফর্ম্যাটিং অ্যাক্সেসর থাকলে তা গন্ধ পেতে শুরু করবে ( public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode;ইত্যাদি)

অথবা, এটি অন্য কোনও উপায়ে বলতে গেলে কোনও প্যাটার্ন ব্যবহার করা আপনার কোডগুলিকে স্বয়ংক্রিয়ভাবে "প্যাটার্নের গন্ধ" তৈরি করে না। আপনি যদি এই গুণটি অর্জন করতে চান তবে আপনাকে এটির অপব্যবহার করতে হবে।


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

3

একক দায়িত্বের নীতি ভঙ্গ করে। কেন ফোন নম্বর ক্লাস করা যায় না, ইত্যাদি ...?


ঠিক আছে, আমি আসলে এটির সাথে একমত (ammoQ এর উত্তরের অধীনে আলোচনা দেখুন), তবে আমারও কি একটি FullNameক্লাস করা উচিত ?
ডেভুসার

হ্যাঁ, আপনার উচিত, তবে আপনার "বানানটি সম্পূর্ণ" থেকে "ফুলনাম" এ বানানটি সংশোধন করা উচিত। বা হতে পারে "ব্যক্তিগত নাম", যেহেতু এটি কোনও ব্যক্তির নাম এবং পূর্ণ নয়।
কেভিন ক্লাইন

1
সত্যি? প্রদত্ত শ্রেণিটি বাড়ার প্রত্যাশা না করা হলে ঠিক এর সাথে ভুল কী? এমনকি যদি এটি বৃদ্ধি পায়, তখন পুনরায় ফ্যাক্টর করা কতটা শক্ত হবে?
চাকরী

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

@ ড্যানম আমাদের এই আলোচনাটি
ম্যাট এলেন

1

আপনার উদাহরণস্বরূপ, সুনির্দিষ্ট ফর্ম্যাটগুলি ব্যবহার করার পক্ষে এটি এত বড় চুক্তি হিসাবে আমি দেখছি না। এটি এক বা দুটি এবং অ্যাপ্লিকেশনটির সমস্ত অংশ একই বিন্যাস ব্যবহার করে।

কোথায় যে সিদ্ধান্ত ভেঙ্গে শুরু করবেন হয় যখন আপনি বিভিন্ন স্থানে যাচ্ছে একই তথ্য আছে বিভিন্ন ফরম্যাটে প্রয়োজন

যদি এটি ঘটে থাকে তবে আমি Memberক্লাসটি আবার টেনে আনতে প্ররোচিত হব :

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }  
}

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

public static class CSVMemberAdapter
{
    public static string ToCSV(this Member mbr)
    {
         return mbr.Id + "," + mbr.LastName + "," + mbr.FirstName, "," mbr.PhoneNumber;
    }
}

সর্বদা ধরে নেওয়া যে আপনি ডেটা স্যানিটাইজ করেছেন যাতে কোনও কমা না থাকে ইত্যাদি।

অ্যাডাপ্টারের একটি এক্সটেনশন পদ্ধতি হতে হবে না, তবে এই মেক-বিশ্বাসের ক্ষেত্রে এটি উপযুক্ত বলে মনে হচ্ছে।


আমি সি # লিখেছি তার পরে এটি বেশ কিছুক্ষণ হয়েছে, তবে অবশ্যই সিরিয়ালাইজ ক্লাস রয়েছে যা এটি পরিচালনা করতে পারে, ক্লান্তিপূর্ণভাবে লেখার পরিবর্তে ক্লান্তিকরভাবে টোসএসভি-র উপর এবং ওভার এবং ওভার এবং ওভার এবং ওভার এবং ওভার এবং আরও বেশি এবং আরও বেশি এবং বেশি ...
কেভিন cline

@ কেভিন ক্লাইন: প্রতিটি সিঙ্কে আপনার কী প্রয়োজন তা নির্ভর করে। তাদের যদি প্রয়োজন হয় তবে সিরিয়ালযুক্ত এক্সএমএল, জরিমানা। অনেক সিস্টেম না। এটি যদি এর overচেয়ে অনেকবার করতে হয় তবে ডিজাইনে কিছু ভুল আছে।
পিটার কে।

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

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