অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং: গেটর / সেটার বা লজিক্যাল নাম


12

আমি বর্তমানে লিখছি এমন একটি ক্লাসের একটি ইন্টারফেস সম্পর্কে চিন্তা করছি। এই শ্রেণিতে একটি চরিত্রের জন্য শৈলী রয়েছে, উদাহরণস্বরূপ, চরিত্রটি সাহসী, তির্যক, আন্ডারলাইন করা ইত্যাদি etc. আমি নিজের সাথে দু'দিন ধরেই বিতর্ক করে যাচ্ছি যে পদ্ধতিগুলি মানগুলিতে পরিবর্তন করে সেগুলির জন্য আমাকে গিটার / সেটার বা যৌক্তিক নাম ব্যবহার করা উচিত কিনা I've এই শৈলী। আমি লজিকাল নামগুলি পছন্দ করতে চাইছি, এর অর্থ কোড লেখার অর্থ যা কার্যকর এবং তাত্ত্বিক নয়। আমাকে যদি আপনি একটি উদাহরণ দিতে।

আমি একটি বর্গ পেয়েছেন CharacterStylesযা সদস্য ভেরিয়েবল আছে bold, italic, underline(এবং কিছু অন্যদের, কিন্তু আমি এটা সহজ রাখা তাদের ছেড়ে দেব)। প্রোগ্রামের অন্যান্য অংশগুলিকে এই ভেরিয়েবলগুলি অ্যাক্সেস করার অনুমতি দেওয়ার সবচেয়ে সহজ উপায় হ'ল গিটার / সেটার পদ্ধতিগুলি লিখতে হবে, যাতে আপনি করতে পারেন styles.setBold(true)এবং styles.setItalic(false)

তবে আমি এটি পছন্দ করি না। কেবলমাত্র অনেকেই বলে না যে গ্রাহকরা / সেটটাররা এনক্যাপসুলেশন ভেঙে দেয় (এটি কি আসলেই খারাপ?), তবে বেশিরভাগ কারণেই এটি আমার কাছে যৌক্তিক বলে মনে হয় না। আমি একটি পদ্ধতি styles.format("bold", true)বা এই জাতীয় কিছু দিয়ে একটি চরিত্রের স্টাইল আশা করি তবে এই সমস্ত পদ্ধতির মাধ্যমে নয়।

এক সমস্যা যদিও এখন পর্যন্ত। যেহেতু আপনি সি ++ তে স্ট্রিংয়ের বিষয়বস্তু দ্বারা কোনও অবজেক্টের সদস্য ভেরিয়েবল অ্যাক্সেস করতে পারবেন না, তাই আমাকে হয় সমস্ত স্টাইলের জন্য একটি বড় if-বিবৃতি / স্যুইচ ধারক লিখতে হবে, অথবা আমাকে শৈলীগুলি কোনও এসোসিয়েটিভ অ্যারেতে সঞ্চয় করতে হবে ( mAP)।

আমি সেরা উপায় কি তা বুঝতে পারি না। এক মুহুর্তে আমি মনে করি আমার লেখক / সেটটার লিখতে হবে এবং পরের মুহূর্তে আমি অন্য পথে ঝুঁকছি। আমার প্রশ্ন: আপনি কি করবেন? এবং আপনি এটা কেন করবেন?


ক্যারেক্টার স্টাইলস ক্লাসটি আসলে তিনটি বুলিয়ান বান্ডিল ছাড়া অন্য কিছু করে? এটি কীভাবে গ্রাস হয়?
ক্যানালাস চিহ্নিত করুন

হ্যাঁ, কারণ ক্যারেক্টারস্টাইলগুলি অন্য ক্যারেক্টারস্টাইল থেকে উত্তরাধিকারী হতে সক্ষম হওয়া উচিত। এর অর্থ এই যে আমি যদি সঙ্গে একটি CharacterStyles আছে boldসেট trueএবং অন্যান্য ভেরিয়েবল undefined, অন্যান্য ভেরিয়েবলের জন্য সংগ্রহকারী পদ্ধতি, পিতা বা মাতা শৈলী (যা অন্য সম্পত্তি সংরক্ষণ করা হয়) এর মান উচিত কিছুদিনের জন্য সংগ্রহকারী boldসম্পত্তি ফেরত পাঠাবেন true। নাম এবং উপায়টি ইন্টারফেসে প্রদর্শিত হওয়ার মতো আরও কিছু জিনিস রয়েছে।
ব্যাঙ

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

@ তায়না: প্রকৃতপক্ষে, আমি এনাম ব্যবহার সম্পর্কেও ভেবেছিলাম, তবে এটি কেবল একটি সামান্য বিবরণ। আমি কেবল NUL এ অপরিজ্ঞাত মান সেট করার পরিকল্পনা করছিলাম। এটি কি সেরা উপায় নয়?
ব্যাঙ

উত্তর:


6

হ্যাঁ, গ্রাহকরা / সেটটাররা এনক্যাপসুলেশনটি বিরতি দেয় - এগুলি মূলত সরাসরি অন্তর্নিহিত ক্ষেত্রটি অ্যাক্সেস করার মধ্যে একটি অতিরিক্ত স্তর। আপনি সম্ভবত এটি সরাসরি অ্যাক্সেস করতে পারেন।

এখন, আপনি যদি ক্ষেত্রটি অ্যাক্সেস করার জন্য আরও জটিল পদ্ধতি চান তবে তা বৈধ, তবে ক্ষেত্রটি উন্মোচনের পরিবর্তে, আপনার পরিবর্তে ক্লাসটি কী পদ্ধতিগুলি সরবরাহ করা উচিত তা ভাবতে হবে। অর্থাত। কোনও সম্পত্তি ব্যবহার করে প্রকাশিত অর্থের মান সহ একটি ব্যাঙ্ক শ্রেণীর পরিবর্তে, আপনাকে ভাবতে হবে যে কোনও ব্যাঙ্কের অবজেক্টে কী ধরণের অ্যাক্সেসের অফার দেওয়া উচিত (অর্থ সংযোজন, প্রত্যাহার, ভারসাম্য পাওয়া) এবং পরিবর্তে সেগুলি বাস্তবায়ন করা উচিত। মানি ভেরিয়েবলের কোনও সম্পত্তি সরাসরি মানি ভেরিয়েবলটি সরাসরি প্রকাশের চেয়ে সিনথেটিকভাবে আলাদা।

DrDobbs এর একটি নিবন্ধ রয়েছে যা আরও বলেছে।

আপনার সমস্যার জন্য, আমার কাছে 2 টি পদ্ধতি রয়েছে স্টাইল এবং ক্লিয়ারস্টাইল (বা যাই হোক না কেন) যা সম্ভাব্য শৈলীর প্রশংসা করে। এই পদ্ধতির অভ্যন্তরে একটি স্যুইচ বিবৃতি যথাযথ শ্রেণীর ভেরিয়েবলগুলিতে প্রাসঙ্গিক মান প্রয়োগ করবে। এই ভাবে, যদি আপনি আপনি সেগুলি পরে একটি স্ট্রিং (উদাহরণস্বরূপ HTML এ ব্যবহারের জন্য) হিসেবে সংরক্ষণ করার সিদ্ধান্ত নেন অন্য কিছু করার শৈলীর অভ্যন্তরীণ উপস্থাপনা পরিবর্তন করতে পারেন - কিছু যে হবে আপনার বর্গ সকল ব্যবহারকারীর প্রয়োজন পরিবর্তন করা খুব যদি আপনি ব্যবহার বৈশিষ্ট্য পেতে / সেট করুন।

আপনি যদি স্বেচ্ছাচারিত মান নিতে চান তবে আপনি স্ট্রিংগুলিতে স্যুইচ করতে পারেন, হয় তারপর একটি বড় বিবৃতি (যদি সেগুলির মধ্যে কয়েকটি থাকে), অথবা স্ট্রিং মানগুলির একটি মানচিত্র স্ট্যান্ড :: মেম_ফুন (বা স্টেড :: ফাংশন ) সুতরাং "গা bold়" মানচিত্র কীতে এটির মান একটি sts :: mem_fun এমন একটি পদ্ধতিতে সংরক্ষণ করা হবে যা ভেরিয়েবলটিকে সত্য থেকে নির্ধারণ করে (যদি স্ট্রিংগুলি সদস্য ভেরিয়েবলের নামের মতো হয় তবে আপনি ব্যবহার করতে পারেন) আপনার কোডের যে পরিমাণ কোড লিখতে হবে তা হ্রাস করতে স্ট্রিংফাইং ম্যাক্রো )


দুর্দান্ত উত্তর! বিশেষত এইচটিএমএল হিসাবে ডেটা সংরক্ষণ করার অংশটি আমাকে এই রাস্তায় নামার একটি ভাল কারণ হিসাবে আঘাত করেছিল। সুতরাং আপনি একটি এনামে বিভিন্ন স্টাইল সংরক্ষণ এবং তারপরে স্টাইলগুলি সেট করার পরামর্শ দিবেন styles.setStyle(BOLD, true)? এটা কি ঠিক?
ব্যাঙ

হ্যাঁ, কেবলমাত্র আমার কাছে দুটি পদ্ধতি রয়েছে - সেট স্টাইল (বোল্ড) এবং ক্লিয়ারস্টাইল (বোল্ড)। ২ য় প্যারামিটারটি ভুলে যান, আমি কেবল এটি পছন্দ করি এবং আপনি স্টাইলের সমস্ত পতাকা সাফ করার জন্য কোনও প্যারামিটার না নিয়ে ক্লিয়ারস্টাইলকে ওভারলোড করতে পারেন।
gbjbaanb

এটি কাজ করবে না, কারণ কিছু ধরণের (ফন্টের আকারের মতো) একটি পরামিতি প্রয়োজন। তবে এখনও উত্তরের জন্য ধন্যবাদ!
ব্যাঙ

আমি এটি বাস্তবায়নের চেষ্টা করছি, তবে একটি সমস্যাও আমি বিবেচনা করি নি: আপনি styles.getStyle(BOLD)যখন বুলিয়ান টাইপের সদস্য ভেরিয়েবলগুলিই রাখেন না, তবে পূর্ণসংখ্যা এবং স্ট্রিংয়ের ধরণের (উদাহরণস্বরূপ styles.getStyle(FONTSIZE)) কীভাবে প্রয়োগ করেন । যেহেতু আপনি রিটার্নের প্রকারগুলি ওভারলোড করতে পারবেন না, আপনি এটি কীভাবে প্রোগ্রাম করবেন? আমি জানি আপনি অকার্যকর পয়েন্টার ব্যবহার করতে পারেন তবে এটি আমার কাছে সত্যই খারাপ উপায় বলে মনে হচ্ছে। এটি কীভাবে করবেন তাতে আপনার কোনও ইঙ্গিত রয়েছে?
ব্যাঙ

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

11

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

কলিং কোডটি জানতে আপনার এই পাঠকের চারপাশে কতগুলি র‌্যাপার রেখেছিল তা জানতে হবে না, আপনি কেবল বাইরের অবজেক্টে একটি পদ্ধতি কল করেন এবং এটি স্ট্যাকটিকে কল করে।

সিউডোকোড উদাহরণের জন্য:

class TextWriter : TextDrawingInterface {
    public:
        void WriteString(string x) {
            // write some text somewhere somehow
        }
}

class BoldDecorator : TextDrawingInterface {
    public:
        void WriteString(string x) {
            // bold application on
            m_textWriter.WriteString(x);
            // bold application off
        }

        ctor (TextDrawingInterface textWriter) {
            m_textWriter = textWriter;
        }

    private:
        TextWriter m_TextWriter;
}

এবং তাই, প্রতিটি সজ্জা শৈলী জন্য। এর সহজ ব্যবহারে, আপনি তখন বলতে পারেন

TextDrawingInterface GetDecoratedTextWriter() {
    return new BoldDecorator(new ItalicDecorator(new TextWriter()));
}

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


হুম, আমি আগামীকাল তাজা মন নিয়ে এক নজর দেখতে যাচ্ছি এবং তখনই তোমার কাছে ফিরে আসব। উত্তর করার জন্য ধন্যবাদ.
ব্যাঙ

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

যদিও এটি একটি দুর্দান্ত উত্তর, এটি অপের প্রশ্নের পুনরায় পরিচয় করে না? "সাহসী অ্যাপ্লিকেশন চালু" -> এটি কীভাবে চলছে? সেটবার্ড () এর মতো সেটার / গেটার ব্যবহার করছেন? যা ঠিক অপের প্রশ্ন।

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

1
আমি সবসময়ই ভেবেছিলাম সাজসজ্জার প্যাটার্নটি সাজসজ্জার আদেশ দেয়। দেখানো উদাহরণ কোড বিবেচনা করুন; কীভাবে কেউ ইটালিকডেকোরেটর অপসারণ করতে যায়? তবুও, আমি ডেকোরেটরের মতো কিছু করার উপায় বলে মনে করি। বোল্ড, ইটালিক এবং আন্ডারলাইন কেবল তিনটি স্টাইল নয়। পাতলা, আধা গোলকীর্ণ, ঘনীভূত, কালো, প্রশস্ত, ইশালিক-সঙ্গে-স্বশ, ছোট ক্যাপস ইত্যাদি রয়েছে আপনার কোনও চরিত্রের মধ্যে নির্বিচারে বড় আকারের শৈলীর প্রয়োগ করার জন্য আপনার প্রয়োজন হতে পারে।
ব্যারি ব্রাউন

0

আমি দ্বিতীয় সমাধানের দিকে ঝুঁকতে চাই। এটি আরও মার্জিত এবং নমনীয় দেখায়। যদিও সাহসী, তির্যক এবং আন্ডারলাইন (ওভারলাইন?) ব্যতীত অন্য ধরণের কল্পনা করা কঠিন তবে সদস্য ভেরিয়েবলগুলি ব্যবহার করে নতুন ধরণের যুক্ত করা কঠিন হবে।

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


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

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

তবে আমার গ্রাহককে কাস্টম বৈশিষ্ট্য যুক্ত করার দরকার নেই। এবং সেক্ষেত্রে আমার মনে হয় এটি কিছুটা "হ্যাকি" দেখাচ্ছে। আপনি একমত না?
ব্যাঙ

যদি আপনি গতিশীল সংখ্যার গুণাবলী ইস্যুটির মুখোমুখি না হন তবে এগুলি সঞ্চয় করার জন্য আপনার নমনীয় স্থানের প্রয়োজন হবে না। এটা সত্য :) যদিও আমি অন্য অংশের সাথে একমত নই। অভিধান / হ্যাশম্যাপ / ইত্যাদিতে স্ট্রোরিং বৈশিষ্ট্যগুলি আমার মতে খারাপ দৃষ্টিভঙ্গি নয়।
আন্দ্রেজেববাক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.