কোনটি আরও ভাল: সিলেকশন স্ট্রিং প্যারামিটার সহ একত্রে গিটার বা 1 পদ্ধতি?


15

আমাদের জ্ঞানের ডোমেনটিতে লোকেদের খালি পায়ে একটি চাপ-রেকর্ডিং প্লেট ধরে হাঁটা জড়িত। কোনও চিত্রের সেন্সর ডেটাতে স্বীকৃতি পেলে আমরা 'চিত্র' শ্রেণীর অবজেক্টগুলির ফলাফল হিসাবে আমরা চিত্র স্বীকৃতিটি করি।

বেশ কয়েকটি গণনা রয়েছে যা অবশ্যই পায়ের ডেটাতে সম্পাদন করা উচিত।

এখন, কোন এপিআই ভাল হবে:

class Foot : public RecognizedObject  { 
  MaxPressureFrame getMaxPressureFrame();
  FootAxis getFootAxis();
  AnatomicalZones getAnatomicalZones();

  // + similar getters for other calculations

  // ...
}

বা:

class Foot : public RecognizedObject {
  virtual CalculationBase getCalculation(QString aName);

  // ...
}

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

কোন পরামর্শ?

প্রথম পদ্ধতির জন্য কিছু প্রো এর হতে পারে:

  • KISS - সবকিছু খুব কংক্রিট। এপিআই, তবে বাস্তবায়নও।
  • শক্তভাবে টাইপ করা রিটার্ন মান।
  • এই শ্রেণি থেকে উত্তরাধিকার বোকামি-প্রমাণ। কোনও কিছুই ওভাররাইড করা যায় না, কেবল যুক্ত করা হয়।
  • এপিআই খুব বন্ধ, কিছুই ভিতরে যায় না, কিছুই ওভাররাইড করা যায় না, তাই কম ভুল হতে পারে।

কিছু কন এর:

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

কিছু সমর্থক দ্বিতীয় পদ্ধতির জন্য:

  • আরো নমনীয়
  • এপিআই পরিবর্তনের সম্ভাবনা কম, (ধরে নিই আমরা বিমূর্তিটি সঠিকভাবে ধরেছি, যদি না হয় তবে পরিবর্তনের জন্য আরও বেশি ব্যয় হবে)

কিছু কন এর:

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

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

আপনি যদি স্ট্রিং প্যারামিটারটিকে ট্রিগার করতে ব্যবহার করেন তবে নির্দিষ্ট গণনার সমস্ত ব্যবহার খুঁজে পাওয়া শক্ত। 100% হওয়া কঠিন আপনি তাদের সমস্তটি পেয়েছেন।
কনরাড মোরাওস্কি

দুই বোথ ওয়ার্ল্ডস শ্রেষ্ঠ নিন এবং invoking getters একটি গুচ্ছ সঙ্গে একটি ছদ্মরূপ লিখতে getCalculation()
নালীর সাথে

1
এনামগুলি অবশ্যই স্ট্রিংয়ের চেয়ে ভাল! আমি এই চিন্তা ছিল না। তারা এপিআইকে সীমাবদ্ধ করে এবং স্ট্রিং প্যারামিটারের অপব্যবহার রোধ করে (যেমন টোকেন এবং অন্যান্য ক্রাপের সমঝোতা) সুতরাং আমি অনুমান করি যে তুলনাটি স্ট্রিংয়ের পরিবর্তে এনামের সাথে বিকল্প 1 এবং বিকল্প 2 এর মধ্যে রয়েছে।
বিগি

উত্তর:


6

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

  • আমাদের উদ্ভাবিত প্রতিটি নতুন গণনা তালিকার সাথে যুক্ত হওয়ার সাথে সাথে গেটের সংখ্যা বৃদ্ধি পাবে

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

  • এপিআই পরিবর্তন হওয়ার সম্ভাবনা বেশি এবং যদি ব্রেকিং পরিবর্তনগুলি চালু করা হয় তবে আমাদের একটি নতুন এপিআই সংস্করণ, একটি ফুট 2 দরকার।

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

  • অন্যান্য প্রকল্পে ক্লাসটি পুনরায় ব্যবহারের ক্ষেত্রে আমাদের প্রতিটি গণনার প্রয়োজন হবে না

আমি দেখতে পাচ্ছি না যে কীভাবে ম্যাজিক স্ট্রিং বা এনামগুলি ব্যবহার করা এতে সহায়তা করবে ... যদি আমি সঠিকভাবে বুঝতে পারি তবে কোডটি আপনি ফুট ক্লাসে অন্তর্ভুক্ত করেন বা আপনি এটি কয়েকটি ছোট শ্রেণিতে বিভক্ত করেন এবং এটি উভয় বিকল্পের জন্য যায়


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

কমান্ড নির্বাচনকারী ব্যবহার করার সুবিধাটি হ'ল কারও কাছে এমন একটি বাস্তবায়ন থাকতে পারে যা একটি কমান্ড গ্রহণ করে যা ইন্টারফেসের সাথে সরবরাহিত স্ট্যাটিক সহায়ক পদ্ধতিটি কল করতে বোঝে না। যদি কমান্ডটি এমন কিছু প্রতিনিধিত্ব করে যা সাধারণ উদ্দেশ্যে উদ্দেশ্য ব্যবহার করে প্রায় সমস্ত বাস্তবায়ন করা যায় তবে কিছু বাস্তবায়ন আরও ভাল উপায়ে করতে সক্ষম হয় [উদাহরণস্বরূপ বিবেচনা করুন IEnumerable<T>.Count], এই জাতীয় পদ্ধতির মাধ্যমে কোডটি নতুন কার্যকারিতা সুবিধা উপভোগ করতে পারে ইন্টারফেস বৈশিষ্ট্যগুলি প্রয়োগ করে যা তাদের সমর্থন করে তবে পুরানো বাস্তবায়নের সাথে সামঞ্জস্য থাকে।
ক্যাট

12

আমি বিকল্প 3 সুপারিশ করব: এটি পরিষ্কার করে দিন যে গণনাগুলি a এর বিমূর্ততার কোনও অন্তর্নিহিত অংশ নয় Foot, তবে এটি চালিত করুন। তারপরে আপনি বিভাজন করতে পারেন Footএবং গণনাগুলি পৃথক শ্রেণিতে ভাগ করতে পারেন, এটির মতো:

class Foot : public RecognizedObject {
public:
    // Rather low-level API to access all characteristics that might be needed by a calculation
};

class MaxPressureFrame {
public:
    MaxPressureFrame(const Foot& aFoot); // Performs the calculation based on the information in aFoot
    //API for accessing the results of the calculation
};

// Similar classes for other calculations

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


বিকল্প 1 এবং 2 এর চেয়ে অবশ্যই দুর্দান্ত This কৌশল কৌশল নকশার প্যাটার্নটি ব্যবহার করা থেকে এটি কেবলমাত্র একটি সামান্য পদক্ষেপ দূরে।
ব্রায়ান

4
এটি উপযুক্ত হতে পারে। এটি ওভারকিল হতে পারে। গণনা কত জটিল তা নির্ভর করে। আপনি একটি ম্যাক্সপ্রেসফ্রেমস্ট্রেটজি এবং একটি ম্যাক্সপ্রেসফ্রেমস্ট্র্যাটজিফ্যাক্টরি যুক্ত করতে যাচ্ছেন? এবং এটি ফুটকে অ্যানিমিক অবজেক্টে পরিণত করে।
user949300

যদিও এটি একটি দুর্দান্ত বিকল্প, নির্ভরতা বিপরীত করা আমাদের ক্ষেত্রে কার্যকর হবে না। পায়েও কিছুটা মধ্যস্থতাকারী হিসাবে কাজ করতে হয়, কারণ কিছু গণনা পুনরায় গণনা করা দরকার যদি অন্য কোনওটি পরিবর্তিত হয় (ব্যবহারকারী কোনও প্যারামিটার পরিবর্তন করার কারণে বা তাই)।
বুগি

@ বিজি: গণনার মধ্যে এই ধরনের নির্ভরশীলতার সাথে আমি @ ব্যবহারকারী ১১64৪62২২ এর সাথে একমত যে প্রথম বিকল্পটি সবচেয়ে ভাল `
বার্ট ভ্যান ইনজেন শিেনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.