পদ্ধতির পরামিতিগুলির পরিবর্তে কন্সট্রাক্টরের ডেটা পাস করার সময় শ্রেণীর ধারণা কীভাবে পরিবর্তিত হয়?


12

যাক আমরা পার্সার তৈরি করছি। একটি বাস্তবায়ন হতে পারে:

public sealed class Parser1
{
    public string Parse(string text)
    {
       ...
    }
}

অথবা পরিবর্তে আমরা পাঠ্যটি কনস্ট্রাক্টরকে দিতে পারি:

public sealed class Parser2
{
    public Parser2(string text)
    {
       this.text = text;
    }

    public string Parse()
    {
       ...
    }
}

উভয় ক্ষেত্রেই ব্যবহার সহজ, তবে অন্যটির তুলনায় প্যারামিটার ইনপুট সক্ষম করার অর্থ কীParser1 ? কোনও সহযোগী প্রোগ্রামারকে আমি কী বার্তা পাঠিয়েছি, যখন তারা এপিআইয়ের দিকে তাকান? এছাড়াও, নির্দিষ্ট কিছু ক্ষেত্রে কোনও প্রযুক্তিগত সুবিধা / অসুবিধা আছে কি?

আর একটি প্রশ্ন আসে যখন আমি বুঝতে পারি যে দ্বিতীয় প্রয়োগের ক্ষেত্রে একটি ইন্টারফেস যথেষ্ট অর্থহীন হবে:

public interface IParser
{
    string Parse();
}

... যেখানে প্রথমটিতে একটি ইন্টারফেস কমপক্ষে কোনও উদ্দেশ্যে পরিবেশন করতে পারে। এটি কি বিশেষভাবে কোনও কিছু বোঝায় যে একটি শ্রেণি "ইন্টারফেসযোগ্য" বা না?


ও এর শব্দার্থকরা আসলে কীভাবে অভিপ্রায় প্রকাশ করে তা নিয়ে আমি প্রথম কিছু কার্যকর প্রশ্নোত্তর দেখেছি। এখন অবধি এটি আমার কাছে কেবল সিনট্যাকটিক চিনি ছিল।

উত্তর:


11

শব্দার্থকভাবে বলতে গেলে, ওওপিতে আপনাকে কেবল নির্মাণকারীর ক্লাস তৈরির জন্য প্রয়োজনীয় প্যারামিটারগুলির একটি সেট পাস করতে হবে - একইভাবে আপনি যখন কোনও পদ্ধতি কল করেন তখন আপনাকে কেবল এটির ব্যবসার যুক্তি সম্পাদন করার জন্য প্রয়োজনীয় পরামিতিগুলি পাস করতে হবে।

কনস্ট্রাক্টরে আপনাকে যে প্যারামিটারগুলি পাস করতে হবে তা হ'ল প্যারামিটারগুলি যার কোনও বুদ্ধিমান ডিফল্ট মান নেই এবং যদি আপনার শ্রেণি অপরিবর্তনীয় (বা প্রকৃতপক্ষে struct) হয় তবে সমস্ত অ-ডিফল্ট বৈশিষ্ট্যগুলি অবশ্যই পাস করতে হবে।

আপনার দুটি উদাহরণ সম্পর্কে:

  • আপনি যদি textকনস্ট্রাক্টরের কাছে পাস করেন তবে এটি ইঙ্গিত দেয় যে Parser2ক্লাসটি বিশেষত পরবর্তী সময়ে পাঠ্যের উদাহরণটি বিশ্লেষণের জন্য নির্মিত হবে। এটি একটি নির্দিষ্ট পার্সার হবে। এটি সাধারণত যখন ক্লাস তৈরি করা খুব ব্যয়বহুল বা সূক্ষ্ম হয় তখন কোনও RegEx কনস্ট্রাক্টরে সংকলিত হতে পারে, তাই আপনি একবার উদাহরণ ধরলে আপনি সংকলনের ব্যয় না করে আবার ব্যবহার করতে পারবেন; আর একটি উদাহরণ পিআরএনজি সূচনা করা হচ্ছে - এটি খুব কম করা গেলে এটি আরও ভাল।
  • আপনি যদি textপদ্ধতিতে পাস করেন তবে এটি সংকেত দেয় যা Parser1কলগুলি দ্বারা বিভিন্ন পাঠ্যকে বিশ্লেষণ করতে পুনরায় ব্যবহার করা যেতে পারে।

3
আমি যুক্ত করব যে পার্সার 1 রাষ্ট্র বজায় রাখে এমন একটি, দুর্বল, সংকেত রয়েছে - অর্থাত্ কোনও নির্দিষ্ট পাঠ্যের ভিন্ন ভিন্ন ফলাফল উত্পন্ন হতে পারে তার উপর নির্ভর করে পূর্বে টাট দৃষ্টান্তে করা হয়েছিল। এটি অগত্যা নয়, তবে এটিও হতে পারে।
জোমরনো

8

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

সরাসরি কোনও পদ্ধতিতে প্যারামিটার পাস করার অর্থ কোনও উপায়ে একটি বার্তা প্রেরণ এবং সম্ভবত কোনও উত্তর পাওয়া যায়। এটির দ্বারা, ক্লায়েন্টটি তার জন্য কোনও পরিষেবা সরবরাহ করতে চায়।

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


+1 টি। সমন্বয় হ'ল কীভাবে আমি সিদ্ধান্ত নিই যে এটি পদ্ধতি বা নির্মাতার উপর নির্ভর করে।
ঝোলেট

4

উভয় ক্ষেত্রেই ব্যবহার সহজ, তবে অন্যটির তুলনায় পার্সার 1 এ পরামিতি ইনপুট সক্ষম করার অর্থ কী?

এটি একটি মৌলিক নকশা স্থানান্তর। এবং ডিজাইনের উদ্দেশ্য এবং অর্থ প্রকাশ করা উচিত। আপনি যে প্রতিটি স্ট্রিং পার্স করতে চান তার জন্য আপনার কি আলাদা আলাদা জিনিস থাকতে হবে? অন্য কথায়, স্ট্রিংএক্সের সাথে পার্সারের একটি উদাহরণ এবং স্ট্রিংওয়াইয়ের সাথে আমাদের অন্য উদাহরণের প্রয়োজন কেন? পার্স (আইএনএন) এবং প্রদত্ত স্ট্রিং সম্পর্কে কী যে দুজনকে অবশ্যই একসাথে বেঁচে থাকতে হবে এবং মারা যেতে হবে? ধরে নিই যে "অন্তর্নিহিত [পার্সিং] বাস্তবায়ন" (যেমন রবার্ট হার্ভে বলেছেন) পরিবর্তিত হয় না, মনে হয় এর কোনও অর্থ নেই। এবং তারপরেও এর সন্দেহজনক আইএমএইচও।

পদ্ধতির পরামিতিগুলির পরিবর্তে কন্সট্রাক্টরের ডেটা পাস করার সময় শ্রেণীর ধারণা কীভাবে পরিবর্তিত হয়?

কনস্ট্রাক্টর প্যারামিটারগুলি আমাকে বলে যে কোনও জিনিসের জন্য এই জিনিসগুলি প্রয়োজনীয়। তাদের ছাড়া উপযুক্ত রাষ্ট্রের নিশ্চয়তা নেই। এছাড়াও, আমি জানি কীভাবে / কেন একটি পার্সার অন্যের থেকে মৌলিকভাবে পৃথক।

কনস্ট্রাক্টর প্যারামিটারগুলি ক্লাসটি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে খুব বেশি জানতে আমাকে বাধা দেয়। পরিবর্তে যদি আমি নির্দিষ্ট বৈশিষ্ট্যগুলি সেট করে রাখার কথা - তবে কীভাবে আমি এটি জানব? কৃমি একটি পুরো ক্যান খোলে। কি সম্পত্তি? কোন ক্রমে? আমি কোন পদ্ধতি ব্যবহার করার আগে? ইত্যাদি।

আর একটি প্রশ্ন আসে যখন আমি বুঝতে পারি যে দ্বিতীয় প্রয়োগের ক্ষেত্রে একটি ইন্টারফেস যথেষ্ট অর্থহীন হবে:

একটি ইন্টারফেস, যেমন এপিআই, ক্লায়েন্ট কোডের সাথে প্রকাশিত পদ্ধতি এবং বৈশিষ্ট্য। public interface { ... }একচেটিয়াভাবে মোড়ানো না । সুতরাং ইন্টারফেসটির অর্থ হয়-বা নির্মাণকারী বনাম পদ্ধতি প্যারামিটার দ্বিধা, না public interface Iparserবনাম NOTpublic sealed class Parser

sealedবর্গ বিজোড় হয়। যদি আমি বিভিন্ন পার্সার বাস্তবায়ন সম্পর্কে চিন্তা করি - আপনি "ইপারসার" উল্লেখ করেছেন - তবে উত্তরাধিকার আমার প্রথম চিন্তা। এটি আমার চিন্তায় একটি প্রাকৃতিক ধারণাগত প্রসার মাত্র। IE সমস্ত ParserXগুলি মূলত Parserএস। কীভাবে এটি বলা যায়? ... একটি জার্মান শেপার্ড একটি কুকুর (উত্তরাধিকার), তবে আমি আমার তোতাটিকে ছালাতে প্রশিক্ষণ দিতে পারি (একটি কুকুরের মতো কাজ - "ইন্টারফেস"); তবে পলি কুকুর নয়, কেবল ভান করে, কুকুরের একটি উপসেট শিখেছে। ক্লাস, বিমূর্ত বা অন্যথায় ইন্টারফেসের পাশাপাশি পুরোপুরি পরিবেশন করে ।


এটি যদি পার্সারের মতো হাঁটে এবং পার্সারের মতো কথা বলে, এটি ... একটি হাঁস!

2

ক্লাসের দ্বিতীয় সংস্করণটি অপরিবর্তনীয় করা যায়।

ইন্টারফেসটি এখনও অন্তর্নিহিত বাস্তবায়ন অদলবদল করার ক্ষমতা সরবরাহ করতে ব্যবহৃত হতে পারে।


ক্লাসের মধ্যে প্রায়োগিক উপায়ে ক্লাসের মধ্যে ডেটা দিয়ে, প্রথম সংস্করণেও কি তা পরিবর্তনযোগ্য করা যায় না?
সিস্কোহিট

2
একেবারে। তবে অপরিবর্তনীয়তার সাধারণ প্যাটার্ন হ'ল কনস্ট্রাক্টর ব্যবহার করে শ্রেণি সদস্যদের সেট করা, এবং কেবলমাত্র পঠনযোগ্য বৈশিষ্ট্য রয়েছে। ক্রিয়ামূলক প্রোগ্রামিংয়ের জন্য, আপনার এমনকি কোনও ক্লাসের প্রয়োজন নেই।
রবার্ট হার্ভে

সাইক্লা এবং চারিবিডিস: আমি ওও বা অপরিবর্তনীয় ডেটা বেছে নেব? আগে কখনও শুনিনি।

2

Parser1

কোনও ডিফল্ট কনস্ট্রাক্টর দিয়ে বিল্ডিং এবং কোনও পদ্ধতিতে ইনপুট পাঠ্যকে বোঝানো হয় যে পার্সার 1 পুনরায় ব্যবহারযোগ্য।

Parser2

কনস্ট্রাক্টরের ইনপুট পাঠ্যটি ইঙ্গিত দেয় যে প্রতিটি ইনপুট স্ট্রিংয়ের জন্য একটি নতুন পার্সার 2 তৈরি করতে হবে।


অবশ্যই, তাই আমরা যদি এটি পরবর্তী স্তরে নিয়ে যাই তবে একটি পুনঃ-ব্যবহারযোগ্য ব্যবহারের তুলনায় পুনরায় ব্যবহারযোগ্য অবজেক্টের কী উপসংহার করব?
সিস্কোহিট

আমি ডকুমেন্টেশনের পিছনে স্থির করে এর চেয়ে বেশি আর কিছু মনে করব না।
মাইক পার্টরিজ

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