অলৌকিক কোড নকল


56

স্বাভাবিক প্রবৃত্তিটি আপনি কোডটিতে যে কোনও কোডের নকলকে সরিয়ে ফেলেন। তবে, আমি নিজেকে এমন পরিস্থিতিতে পেয়েছি যেখানে সদৃশটি মায়াময়

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

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

আছে অনেক দৃশ্যের মধ্যে মিনিট পার্থক্য এটি কম রক্ষণীয় হয়ে উঠছে, কারণ আমি মূলত সব কার্যকারিতার জন্য callbacks প্রদান করতে, এবং প্রধান যুক্তিবিজ্ঞান কলব্যাক আমন্ত্রণ একটি বিশাল ক্রম মত চেহারা শুরু হয়। শেষ পর্যন্ত আমি কোনও সময় বা কোড সংরক্ষণ করছি না, কারণ প্রতিটি দৃশ্যের নিজস্ব কোড রয়েছে যা সম্পাদিত হয় - সমস্ত কলব্যাকে।

সমস্যাগুলি হ'ল:

  • পার্থক্যগুলি এত মিনিট যে সমস্ত দৃষ্টিতে কোডটি প্রায় একই রকম দেখায় ,
  • এখানে অনেকগুলি পার্থক্য রয়েছে যে আপনি যখন বিশদটি দেখেন তখন কোডের কাছে কিছুটা আলাদা হয় না

এই পরিস্থিতিটি আমি কীভাবে পরিচালনা করব?
কলব্যাক সম্পূর্ণরূপে গঠিত মূল যুক্তি রাখা কি একটি ভাল সমাধান কল করে?
বা আমি কি কোডটি নকল করে কলব্যাক-ভিত্তিক কোডের জটিলতাটি ফেলে দেব?


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

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

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

13
এটিতে আমার ব্যক্তিগত নিয়মটি হ'ল: আমি যদি এক জায়গায় কোডটিতে পরিবর্তন আনি, তবে আমি অন্য কোথাও ঠিক একই পরিবর্তন না করালে এটি কি বাগ হয় ? যদি তা হয় তবে এটি হ'ল খারাপ প্রতিলিপি। যদি আমি নিশ্চিত না হই তবে আপাতত যেকোনও বেশি পাঠযোগ্য with আপনার উদাহরণে আচরণের পার্থক্যগুলি ইচ্ছাকৃত, এবং বাগ হিসাবে বিবেচিত নয়, সুতরাং কিছু অনুলিপি ঠিক আছে।
Ixrec

আপনার অ্যাস্পেক্ট ওরিয়েন্টেড প্রোগ্রামিং সম্পর্কে পড়তে আগ্রহী হতে পারে।
বেন জ্যাকসন

উত্তর:


53

অনুলিপি নির্মূল করতে অনুরূপ কোড একত্রিত করতে হবে কিনা তা সম্পর্কে আপনাকে শেষ পর্যন্ত রায় দিতে হবে।

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

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

আপনার নির্দিষ্ট কোড না জেনে এটি অস্পষ্ট। সদৃশ অপসারণের জন্য সম্ভবত আরও মার্জিত উপায় আছে (যেমন লিন্ডা জিন পরামর্শ দিয়েছেন)। বা, সম্ভবত অ্যাবস্ট্রাকশন পরোয়ানা যথেষ্ট সত্য পুনরাবৃত্তি না।

ডিজাইনের দিকে অপর্যাপ্ত মনোযোগ একটি ক্ষতি, তবে ওভার ডিজাইন থেকেও সাবধান থাকুন।


আমার মনে হয় "দুর্ভাগ্যজনক প্রবণতা" এবং অন্ধভাবে অনুসরণ করা নির্দেশিকাগুলি সম্পর্কে আপনার মন্তব্য স্পষ্ট।
মেল

1
@ মেল আপনি কি বলছেন যে আপনি যদি ভবিষ্যতে এই কোডটি বজায় না রাখেন তবে সঠিক নকশা পাওয়ার উপযুক্ত কারণ আপনার নেই? (কোনও অপরাধ নয়, কেবল আপনি সে সম্পর্কে কী ভাবছেন তা জানতে চান)
স্পটড

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

2
@ user61852 তারপর আপনাকে অনেক অপছন্দ করবে Codeless কোড
রাবারডাক

1
@ ব্যবহারকারী 61852, হাহা - তবে এটি যদি সমস্ত নির্ভর করে (প্রশ্নে দেওয়া তথ্যের উপর)? অতিরিক্ত কিছু নিশ্চিত হওয়ার চেয়ে কম জিনিসই কম সহায়ক।

43

মনে রাখবেন যে শুকনো জ্ঞান সম্পর্কে । আপনার কোড সম্পর্কে একই টুকরো জ্ঞান যদি উভয়টিতেই পাওয়া যায় তবে কোডের দুটি টুকরো একই রকম, অভিন্ন বা সম্পূর্ণ পৃথক দেখাচ্ছে কিনা তা বিবেচ্য নয় ।

জ্ঞানের একটি অংশ একটি সত্য হতে পারে ("অভিযুক্ত মান থেকে সর্বাধিক অনুমোদিত বিচ্যুতি হল 0.1%") বা এটি আপনার প্রক্রিয়াটির কিছু দিক হতে পারে ("এই সারিটিতে তিনটি আইটেম বেশি থাকে না")। এটি মূলত আপনার উত্স কোডে এনকোড করা তথ্যের একক টুকরো।

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


12
এই! ডিআরওয়াইয়ের ফোকাস সদৃশ পরিবর্তনগুলি এড়ানো হচ্ছে ।
ম্যাথিউ এম

এটি বেশ সহায়ক।

1
আমি ভেবেছিলাম ডিআরওয়ির ফোকাস হ'ল কোডের দুটি বিট যাতে অভিন্ন আচরণ করা উচিত তবে তা করা উচিত নয় তা নিশ্চিত করা। সমস্যাটি দ্বিগুণ কাজ নয় কারণ কোড পরিবর্তনগুলি দু'বার প্রয়োগ করতে হবে, আসল সমস্যাটি যখন কোনও কোড পরিবর্তনকে দু'বার প্রয়োগ করা দরকার তবে তা হয় না।
gnasher729

3
@ gnasher729 হ্যাঁ, এটি মূল বিষয়। দুটি টুকরো কোডের জ্ঞানের সদৃশতা থাকলে , আপনি আশা করতে পারেন যে যখন একটি পরিবর্তন করার প্রয়োজন হয়, তখন অন্যটিকেও পরিবর্তন করতে হবে, যার ফলে আপনি বর্ণনা করেছেন এমন সমস্যা দেখা দেয়। যদি তাদের প্রাসঙ্গিক সদৃশ হয় , তবে যখন একজনের পরিবর্তন হওয়া দরকার তখন অন্যটিরও একইরকম থাকার প্রয়োজন হতে পারে। সেক্ষেত্রে আপনি যদি একটি সাধারণ পদ্ধতি বের করেন (বা যাই হোক না কেন), আপনার এখন মোকাবেলা করার জন্য আলাদা সমস্যা রয়েছে
বেন অ্যারনসন

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

27

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


5
না, আমি এটি বিবেচনা করি নি। পরামর্শের জন্য ধন্যবাদ। কৌশল প্যাটার্ন সম্পর্কে দ্রুত পঠন থেকে মনে হচ্ছে এমন কিছু যা আমি খুঁজছি। আমি অবশ্যই আরও তদন্ত করব।
মেল

3
নেই টেমপ্লেট পদ্ধতি প্যাটার্ন । আপনি এটিও বিবেচনা করতে পারেন
শাকিল

5

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

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

@ ড্যান 1111 যেমন উল্লেখ করেছে, এটি রায় রায়তে নেমে আসতে পারে। সময়মতো, আপনি এটি আবিষ্কার করতে পারেন কি না তা আবিষ্কার করতে পারেন।


2

একটি সমস্যা হতে পারে আপনি কার্যকারিতার মাত্র একটি মাত্রায় একটি ইন্টারফেস (তাত্ত্বিক ইন্টারফেস, ভাষা বৈশিষ্ট্য নয়) সরবরাহ করছেন:

A(a,b,c) //a,b,c are your callbacks or other dependencies

একাধিক স্তরের পরিবর্তে কতটা নিয়ন্ত্রণ প্রয়োজন তা নির্ভর করে:

//high level
A(a,b,c)
//lower
A myA(a,b)
B(myA,c)
//even lower
A myA(a)
B myB(myA,b)
C myC(myB,c)
//all the way down to you just having to write the code yourself

যতদূর আমি বুঝতে পেরেছি, আপনি কেবলমাত্র উচ্চ স্তরের ইন্টারফেস (এ) প্রকাশ করেছেন, প্রয়োগের বিশদটি (সেখানে অন্যান্য জিনিসগুলি) গোপন করে।

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

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

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

যেখানে আপনার সামান্য নিয়ন্ত্রণ প্রয়োজন সেখানে একটি একক বস্তু ব্যবহার করুন।

যখন কিছু অদ্ভুততা হওয়ার দরকার হয় তখন সর্বনিম্ন স্তরের কার্যকারিতা ব্যবহার করুন।

এটি খুব কালো-সাদাও ​​নয়। হতে পারে আপনার বড় উচ্চ স্তরের শ্রেণি সম্ভাব্য সমস্ত ব্যবহারের কেস যুক্তিসঙ্গতভাবে কভার করতে পারে। সম্ভবত ব্যবহারের কেসগুলি এত রকমের হয় যে সর্বনিম্ন স্তরের আদিম কার্যকারিতা যথেষ্ট নয়। ভারসাম্য খুঁজে পেতে আপনার উপর নির্ভর করে।


1

ইতিমধ্যে অন্যান্য দরকারী উত্তর রয়েছে। আমি আমার যোগ করা হবে।

সদৃশ খারাপ কারণ

  1. এটি কোডকে বিশৃঙ্খলা করে
  2. এটি কোডের আমাদের সংকোচনের বিষয়টিকে ছড়িয়ে দেয় তবে সবচেয়ে গুরুত্বপূর্ণ
  3. কারণ আপনি যদি এখানে কিছু পরিবর্তন করেন এবং আপনাকেও সেখানে কিছু পরিবর্তন করতে হয় , আপনি ভুলগুলি / পরিচয় করিয়ে দিতে পারেন / .... এবং এটি কখনও ভুলে যাওয়া শক্ত নয়।

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

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

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