অনেক যুক্তিযুক্ত নির্মাণকারীদের এড়ানো


10

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

এটি অর্জনের জন্য, কারখানাটি জেএসএন-পার্সিংয়ের জন্য boost :: संपत्ति_tree ব্যবহার করে। তিনি ptree দিয়ে হাঁটেন এবং সিদ্ধান্ত নেন কোন কোন কংক্রিট অবজেক্ট তৈরি করা উচিত।

তবে, পণ্য-বস্তুর অনেকগুলি ক্ষেত্র (বৈশিষ্ট্য) রয়েছে। কংক্রিট শ্রেণীর উপর নির্ভর করে, অবজেক্টটির প্রায় 5-10 টি বৈশিষ্ট্য রয়েছে, ভবিষ্যতে সম্ভবত আরও বেশি।

সুতরাং আমি নিশ্চিত না যে কীভাবে অবজেক্টগুলির কনস্ট্রাক্টর দেখতে হবে। আমি দুটি সমাধান সম্পর্কে চিন্তা করতে পারি:

1) পণ্যটির নির্মাতা প্রতিটি বৈশিষ্ট্যকে প্যারামিটার হিসাবে প্রত্যাশা করে, সুতরাং, কনস্ট্রাক্টরটি 10+ পরামিতি দিয়ে শেষ হবে। এটি কুৎসিত হবে এবং দীর্ঘ, অপঠনযোগ্য কোড লাইনে নিয়ে যাবে। তবে, সুবিধাটি হ'ল কারখানাটি JSON কে বিশ্লেষণ করতে পারে এবং সঠিক পরামিতিগুলির সাহায্যে নির্মাণকারীকে প্রার্থনা করতে পারে। পণ্য শ্রেণীর জানার দরকার নেই যে এটি JSON কনফিগারেশনের কারণে তৈরি হয়েছে। এটি জেএসএন বা কনফিগারেশন জড়িত আছে তা প্রয়োজন নেই।

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

আমি সমাধান পছন্দ 2)। তবে, আমি নিশ্চিত নই যে এটি ভাল কারখানার প্যাটার্ন কিনা। এটি কোনওভাবেই পণ্যটিকে জানাতে ভুল অনুভব করে যে এটি JSON কনফিগারেশন দিয়ে তৈরি করা হয়েছে। অন্যদিকে, নতুন পণ্যগুলি খুব সাধারণভাবে প্রবর্তন করা যেতে পারে।

সে সম্পর্কে কোন মতামত?



1
আমি আপনার লিঙ্কটি অনুসরণ করেছি। র‌্যাচেট ফ্রিক থেকে উত্তরের রেটে দেওয়া উত্তরের একটি উদাহরণ রয়েছে। কিন্তু এই "নির্মাতা" -প্রশাসনটি কী সমস্যার সমাধান করে? কোড-লাইন ডেটা ক্লাসের ডেটা রয়েছে = বিল্ডার.createResult ();। তবে ক্রিয়েটস রেজাল্টস () - পদ্ধতিতে এখনও 10 প্যারামিটারগুলি ডাটাক্লাস অবজেক্টে পেতে হবে। কিন্তু কিভাবে? দেখে মনে হচ্ছে আপনার বিমূর্তকরণের আরও একটি স্তর রয়েছে তবে ডেটা ক্লাসের নির্মাতা আরও ছোট হন না।
lugge86

বিল্ডার এবং প্রোটোটাইপটি দেখুন।
সিলভিউ বুর্কিয়া

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

1
যদি আপনার শ্রেণিটি খুব বড় হয় তবে নির্মাতার পক্ষে যুক্তিগুলি সরিয়ে নেওয়া এটি খুব বড় নয়
টেলাস্টিন

উত্তর:


10

আমি বিকল্প 2 করব না, কারণ তারপরে আপনি চিরকালের জন্য প্রোস্টিং ট্রি গাছ সংশ্লেষের মাধ্যমে আপনার অবজেক্টের নির্মাণকে সমাধান করেছেন। আপনি যদি এমন ক্লাসের সাথে স্বাচ্ছন্দ্য বোধ করেন যেটির জন্য অনেকগুলি পরামিতি প্রয়োজন, আপনার এমন কনস্ট্রাক্টরের সাথে স্বাচ্ছন্দ্য বোধ করা উচিত যা অনেকগুলি পরামিতি প্রয়োজন, যেমন জীবন!

যদি আপনার প্রধান উদ্বেগ কোড পাঠযোগ্যতা হয় তবে আপনি নির্মাতা প্যাটার্নটি ব্যবহার করতে পারেন, এটি মূলত নামযুক্ত যুক্তির অভাবে সি ++ / জাভা স্টপগ্যাপ। আপনি দেখতে এই জিনিস দেখতে শেষ:

MyObject o = MyObject::Builder()
               .setParam1(val1)
               .setParam2(val2)
               .setParam3(val3)
             .build();

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

https://en.wikipedia.org/wiki/Builder_pattern#C.2B.2B_Example


5

দ্বিতীয় পদ্ধতির ব্যবহার করবেন না।

এটি অবশ্যই সমাধান নয় এবং কেবলমাত্র আপনার ব্যবসায়ের যুক্তিতে কারখানাগুলি রয়েছে এমন অংশের পরিবর্তে আপনার ব্যবসায়িক যুক্তিতে ক্লাসে পৌঁছে দেবে।

উভয় ক্ষেত্রেই:

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

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


ঠিক আছে, বিসনেস যুক্তি একটি কারখানা ব্যবহার করছে যা পণ্যগুলি ফেরত দেয়, সুতরাং, ব্যবসায়ের যুক্তিটি JSON / ptree স্টাফ দেখতে পায় না। তবে আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, নির্মাত্রে পার্সার কোড থাকা ভুল অনুভব করে।
lugge86

ক্লাসটি একটি এম্বেড থাকা সিস্টেমের জন্য একটি জিইউআইতে একটি উইজেট প্রতিনিধিত্ব করছে, সুতরাং, 5+ বৈশিষ্ট্যগুলি আমার কাছে ঠিক বলে মনে হচ্ছে: x_coord, y_coord, পটভূমি রঙ, ফ্রেমসাইজ, ফ্রেমকালার, পাঠ্য ...
lugge86

1
@ lugge86 যদিও আপনি JSON পার্স করার জন্য একটি কারখানা ব্যবহার করছেন এবং এইভাবে newআপনার ব্যবসার যুক্তির ভিতরে কল করা বা নির্মাণ করা এড়ানো সম্ভব নয়, এটি খুব ভাল নকশা নয়। পরীক্ষা করে দেখুন কি জিনিসের জন্য নয় Miško Hevery দ্বারা কথা , যিনি আরো গভীরতার মধ্যে ব্যাখ্যা দিয়েছে কেন কারখানা পদ্ধতির আপনি hinted উভয় টেস্টিং এবং দেখুন পড়া বিন্দু থেকে খারাপ। এছাড়াও, আপনার ক্লাসটি একটি ডেটা অবজেক্ট বলে মনে হচ্ছে এবং তাদের জন্য নিয়মিত পরিষেবা শ্রেণীর চেয়ে বেশি পরামিতি রাখা ভাল। আমি খুব বিরক্ত হবে না।
অ্যান্ডি

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

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

0

বিকল্প 2 প্রায় সঠিক।

উন্নত বিকল্প 2

একটি "সামনের মুখোমুখি" শ্রেণি তৈরি করুন যিনি এর কাজ সেই জেএসওএন-কাঠামোর অবজেক্টটি গ্রহণ করুন এবং বিটগুলি বেছে নেবেন এবং কারখানার কনস্ট্রাক্টরকে কল করুন। এটি কারখানাটি কী তৈরি করে তা ক্লায়েন্টকে দেয়।

  • কারখানার একেবারেই ধারণা নেই যে এ জাতীয় কোনও JSON জিনিস এমনকি বিদ্যমান even
  • কারখানার নির্দিষ্ট কি বিটগুলির প্রয়োজন তা ক্লায়েন্টকে জানতে হবে না।

মূলত "সামনের প্রান্ত" 2 ববকে বলছে : "আমি রেডাক্ট গ্রাহকদের সাথে ডিল করি তাই ইঞ্জিনিয়ারদের যাতে না হয়! আমার লোক দক্ষতা আছে!" দরিদ্র টম। যদি তিনি কেবলই বলতেন "আমি ক্লায়েন্টকে নির্মাণ থেকে ডিক্লুপ করি This এই ফলাফলটি একটি অত্যন্ত সম্মিলিত কারখানা"; সে হয়ত তার চাকরি রেখেছিল।

অনেক বেশি তর্ক?

ক্লায়েন্টের জন্য নয় - সামনের দিকের যোগাযোগ।

সামনের শেষ - কারখানা? যদি 10 প্যারামিটার না হয় তবে আপনি যা করতে পারেন তা আনপ্যাকিং বন্ধ করে দেওয়া হয়, যদি আসল জেএসওন জিনিস না হয় তবে কিছু ডিটিও। এটি কী কারখানায় জেএসএন পাশ করার চেয়ে ভাল? একই পার্থক্য আমি বলি।

আমি পৃথক পরামিতিগুলি পাস করার বিষয়ে দৃ strongly়তার সাথে বিবেচনা করব। একটি পরিষ্কার, সম্মিলিত কারখানার লক্ষ্যে অটল থাকুন। @ ডেভিডপ্যাকার উত্তরের উদ্বেগগুলি এড়িয়ে চলুন

"অনেক যুক্তি" প্রশমিত করা হচ্ছে

  • কারখানা বা শ্রেণি নির্মাতা

    • নির্দিষ্ট শ্রেণি / অবজেক্ট নির্মাণের জন্য কেবল যুক্তি গ্রহণ করা।
    • ডিফল্ট পরামিতি
    • .চ্ছিক পরামিতি
    • নাম যুক্তি
  • ফ্রন্ট এন্ড আর্গুমেন্ট গ্রুপিং

    • উপরের কনস্ট্রাক্টর স্বাক্ষর দ্বারা পরিচালিত যুক্তির মানগুলি পরীক্ষা করে, মূল্যায়ন করে, যাচাই করে, সেট করে ইত্যাদি।

"কারখানার একেবারেই ধারণা নেই যে এ জাতীয় জেএসওন জিনিসটি এমনকি রয়েছে" - ভাল, তাহলে কারখানাটি কীসের জন্য ?? এটি পণ্য এবং গ্রাহক উভয়ই থেকে পণ্য তৈরির বিবরণ গোপন করে। কেন অন্য একটি ক্লাস সাহায্য করা উচিত? আমি ফ্যাক্টরি JSON বলার সাথে ভাল আছি। এক্সএমএল বিশ্লেষণের জন্য কেউ আরেকটি কারখানা বাস্তবায়ন করতে পারে এবং ভবিষ্যতে "অ্যাবস্ট্রাক্ট কারখানা" প্রয়োগ করতে পারে ...
lugge86

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