এমন কোনও ব্যতিক্রমী মামলা রয়েছে যেখানে আমরা নকল কোড গ্রহণ করতে পারি?


57

আমি একটি সফ্টওয়্যার প্রকল্পে কাজ করছি যেখানে আমাদের তিনটি এপিআই তৈরি করতে হবে। জন্য এক বাড়িতে ব্যাংকিং চ্যানেল, এক সংস্থা চ্যানেল এবং জন্য একটি তৃতীয় মোবাইল চ্যানেল।

এজেন্সি এপিআই হ'ল এটি সম্পূর্ণ সম্পূর্ণ কারণ এতে সমস্ত কার্যকারিতা রয়েছে .. তারপরে কিছুটা ছোট হোম এপিআই এবং তারপরে মোবাইল এপিআই।

এখানকার স্থপতিরা একটি সাধারণ স্তর তৈরি করেছিলেন (ক্রস চ্যানেল EJB পরিষেবাগুলি সমস্ত API দ্বারা ভাগ করা হয়েছে)। তবে তারপরে এপিআইগুলি আলাদা।

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

মূলত কন্ট্রোলাররা চ্যানেলঅবজেক্টে বিও ম্যাপিং করছে (এটি আমার পক্ষে এটি করার সঠিক জায়গা নয়) এবং কিছু অতিরিক্ত ইউটিলিটি এবং সিরিয়ালাইজার রয়েছে। সব এখনই সদৃশ। তারা বলছে যে সদৃশ হওয়ার কারণ তারা এপিআই স্বাধীন করতে চায়। "আগামীকাল যদি আমরা এজেন্সি বা মোবাইলের চেয়ে বাড়ির জন্য আলাদা আচরণ চাই আমরা লড়াই করব না !!"

এমন কোনও মামলা আছে যেখানে আমাদের নকল কোড গ্রহণ করা উচিত?


22
এবং যদি তিনটি আগামীকাল রাস্তায় নেমে যায় তারা সিদ্ধান্ত নিয়েছে যে তারা সমস্ত API- র মধ্যে সুসংগত ডেটা অ্যাক্সেস এবং প্রতিনিধিত্ব চায় ... ভাল ... "সংগ্রাম!"
বেকুজ

26
সদৃশ কোড কোনও খারাপ জিনিস নয়। "ডিআরওয়াই ডিউপলিংয়ের শত্রু" এই উক্তিটি যথেষ্ট জোর দেওয়া যায় না।হাইভিং বলেছেন যে, ভবিষ্যতের জন্য এখনকার চেয়ে বরং ডিজাইনিং করা সত্যিই খুব খারাপ জিনিস। ভবিষ্যতটি প্রায় কখনই ঘটে না। পরিবর্তে, এখন যা প্রয়োজন তার জন্য ভাল অটোমেটেড পরীক্ষাগুলি দ্বারা আচ্ছাদিত একটি উচ্চ ডিউপলড সমাধান ডিজাইন করুন design তারপরে, ভবিষ্যতে, যদি অন্যরকম কিছু প্রয়োজন হয় তবে এটি পরিবর্তন করা সহজ easier
ডেভিড আরনো

2
আমি মনে করি যে সদৃশ কোডের জন্য আমি কখনই অনুশোচনা করি নি এমন দুটি ক্ষেত্রে হ'ল (ক) যেখানে নকল কোডটি মোটের খুব ছোট এবং খুব গুরুত্বপূর্ণ অংশ নয় এবং (খ) যেখানে আমি ইতিমধ্যে মারা যাচ্ছে এমন একটি সিস্টেম থেকে কোড অনুলিপি করছি দীর্ঘায়ু জন্য ডিজাইন করা একটি নতুন সিস্টেমে। আরও অনেকগুলি মামলা রয়েছে যেখানে আমি কাঁটাচামচা কোড পরে কান্নাকাটি করেছিলাম।
মাইকেল কে

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

3
একটি তুচ্ছ ঘটনা যেখানে সদৃশ কোডটি গ্রহণযোগ্য হতে পারে যদি এটি স্বয়ংক্রিয়ভাবে উত্পন্ন হয়
সামগাক

উত্তর:


70

প্রতিলিপিকরণ করতে করতে ডান জিনিস, কিন্তু এই কারণে নয়।

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

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

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


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

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

2
ডুপ্লিকেশন হ'ল সঠিক জিনিস যখন রক্ষণাবেক্ষণ ব্যয়ের সাথে তুলনা করা হয় যখন পড়ার যোগ্যতা ব্যয় খুব বেশি হয় যা শেষ পর্যন্ত একসাথে আবদ্ধ হয়। আমি এই দৃশ্যে এটি মোটেই প্রযোজ্য বলে মনে করি না এবং প্রায়শই একটি প্রকল্পে ছোট স্কেলে দেখা যায়, এর মতো কিছু নয়। তারপরেও এটি খুব বিরল যে আপনি এমন পরিস্থিতিতে পড়ুন যেখানে এই ঘটনাটি ঘটে থাকে, যদি আপনার কিছু কুলুঙ্গিত নেস্টেড নকল থাকে যা আপনাকে টেমপ্লেট পদ্ধতি পদ্ধতি বা অনুরূপ ব্যবহার করতে বাধ্য করে তবে ছোট জায়গায়। এটি সাধারণত আপত্তিজনক কোডটি শেষ করবে।
ওপা

উদাহরণ যেখানে ডুপ্লিকেশন কার্যকর (এবং " এখন এটি সামগ্রিকভাবে আরও ব্যয়বহুল হয়ে উঠবে ") ওয়েব অ্যাপ্লিকেশনগুলিতে ইনপুট মূল্যায়ন: আমরা ক্লায়েন্টে প্রথম (সম্ভবত সরলীকৃত) বৈধতা নিয়োগ করি যাতে ব্যবহারকারী সমস্যাগুলির বিষয়ে তাত্ক্ষণিক প্রতিক্রিয়া পান; এবং তারপরে আমরা সার্ভারে একই (বা আরও পুঙ্খানুপুঙ্খ) বৈধকরণ করি কারণ ক্লায়েন্টদের বিশ্বাস করা যায় না।
হ্যাগেন ভন

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

87

রুবি ইকোসিস্টেমের একজন প্রখ্যাত সফটওয়্যার ইঞ্জিনিয়ার এবং লেখক সান্দি মেটজের একটি দুর্দান্ত ব্লগ পোস্ট এবং একটি আলোচনা রয়েছে যেখানে তিনি নকল এবং বিমূর্তির মধ্যকার সম্পর্ক সম্পর্কে কথা বলেছেন। তিনি নিম্নলিখিত সিদ্ধান্তে আসে

সদৃশ ভুল বিমূর্ততা তুলনায় সস্তা

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

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


23
হ্যাঁ হ্যাঁ, আপনি যদি সাধারণ নিয়মগুলি অনুমান করতে না পারেন তবে সেগুলি বিমূর্ত করার চেষ্টা করা কেবল ব্যর্থ হতে পারে। এবং যদি চিঠিপত্রটি কাকতালীয় হয় তবে এটি অল্প সময়ের জন্য হতে পারে।
হস্তান্তরকারী

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

34

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

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

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

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

সুতরাং যদি এটির সক্রিয় দেখা যায় যে সত্যই আলাদা আলাদা সাব টিম থাকবে, প্রতিটি এপিআই-এর জন্য প্রত্যেকে দায়ী, প্রত্যেকে আলাদা আলাদা সময়সূচী এবং সংস্থান সহ, তবে কোডটি নকল করার সময় এসেছে, তবে "কেবল ক্ষেত্রে" নয়।


3
"আগামীকাল" এর চেয়েও বড় সতর্কতা চিহ্নটি আমার জন্য "এটি কখনই পরিবর্তিত হবে না"।
আবুজিটিন গিলিফিরকা

@ আবুজিটিংটিলিফিরকা: এবং প্রশ্ন বা আমার উত্তরটির সাথে এর কী আছে?
ডক ব্রাউন

1
আমি আপনার প্রথম অনুচ্ছেদে চ্যালেঞ্জ করছি।
আবুজিটিন গিলিফিরকা

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

13

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

সুতরাং আপনি স্বায়ত্তশাসন এবং স্বাধীনতা অর্জনের জন্য সদৃশ কোডের মূল্য প্রদান করছেন।


সুতরাং মিলন এড়ানোর জন্য এটি আন্ত-উপাদান নকল। তবে আপনি কি এখনও ইন্ট্রা-উপাদানগুলির সদৃশ এড়াতে চান, তাই না?
TemplateRex

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