কোড যা কোনও মানকে আলাদা উপস্থাপনে রূপান্তর করে, তারপরে আবার এটি রূপান্তর করে যেখানে এটি শুরু হয়েছিল খারাপ, তবে কীভাবে? [বন্ধ]


35

আমি খারাপ প্রোগ্রামিং অনুশীলন সম্পর্কে একটি নিবন্ধ পড়ছিলাম ।

এটি উল্লেখ করা হয়েছে -

"ইয়ো-যো কোড" যা কোনও মানকে আলাদা উপস্থাপনে রূপান্তর করে, তারপরে আবার এটি যেখানে শুরু হয়েছিল সেখানে রূপান্তর করে (যেমন: দশমিককে স্ট্রিনে রূপান্তর করে এবং পরে দশমিকায় রূপান্তর করে, বা একটি স্ট্রিংকে প্যাডিং করে ট্রিমিং করে)

আমি বুঝতে পারি না যে তিনি যে বিশেষ উদাহরণটি দেন তা প্রোগ্রাম লেখার জন্য খারাপ উপায়। পরিস্থিতিটির যদি প্রয়োজন হয় তবে মানটি ব্যবহার করা যেতে পারে তা ফিরে রূপান্তর করা আমার কাছে ঠিক আছে।

কেউ কি এই সম্পর্কে আরও ব্যাখ্যা করতে পারেন?


4
প্রস্তাবিত পাঠ: এই $ {ব্লগ} আলোচনা
মশা

8
বেশিরভাগ সময় এটি কেবল অপ্রয়োজনীয় এবং এটি কেবল ঘটে কারণ প্রোগ্রামার তারা যা চেয়েছিল তা পাওয়ার আরও ভাল উপায় জানত না। ব্লগ এন্ট্রি একটি আদর্শ উদাহরণ কয়েক অনুচ্ছেদ পরে দেয়: "Roundabout code" that accomplishes in many instructions what could be done with far fewer (eg: rounding a number by converting a decimal into a formatted string, then converting the string back into a decimal)if the situation is so that they have to be used?- কি অবস্থা হবে?
কনরাড মোরাউস্কি

3
@gnat আমি কীভাবে এটি একটি খারাপ প্রশ্ন তৈরি করে তা পাই না। আপনি যদি চান তবে আমি এটি সম্পাদনা করতে পারি "কোডটি রূপান্তরিত করে এবং কোনও মানকে খারাপ রূপান্তরিত করে?" এবং এটি আর এই টেমপ্লেটের সাথে খাপ খায় না।
djechlin

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

3
decimal myValue = decimal.Parse(dataReader["myColumn"].ToString())এটি আমার একটি পোষ্য প্রুভ।
ম্যাথু

উত্তর:


125

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

নীতিটি হ'ল সর্বদা হিসাবে, যে কোডটি বিদ্যমান নেই তার মধ্যে সূক্ষ্ম ত্রুটি থাকতে পারে না , যখন কোডটি প্রায়শই বিদ্যমান থাকে does এটি প্যারানয়েড শোনাতে পারে তবে অভিজ্ঞতা আমাদের শিখায় যে এটি উপযুক্ত। যদি আপনি "আমি এই জটিল সিস্টেমটি বোঝার পক্ষে যথেষ্ট স্মার্ট নই" এর স্থায়ী হালকা উদ্বেগ নিয়ে প্রোগ্রামিংয়ের কাছে যান তবে আপনি সঠিক পথে আছেন on


5
ভাল বলেছ. আমাদের প্রোগ্রামাররা সবাই এত সতর্ক হওয়া উচিত।
নীল

58
"যে কোডটি বিদ্যমান নেই তার মধ্যে সূক্ষ্ম ত্রুটি থাকতে পারে না, যখন কোডটি প্রায়শই বিদ্যমান থাকে" ইচ্ছে করে আমি আপনাকে এটির জন্য +2 করতে পারি। কোড না লেখার মানটিকে কখনই মূল্যহীন করবেন না।
বেনিয়ামিন গ্রুইনবাউম

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

36
@ ড্যানিয়েলআর হিকস তাই আসুন সেই সাধারণ তারিখটি (10 নভেম্বর 2014) একটি স্ট্রিংয়ে রূপান্তর করুন -> 10-11-2014 এবং একটি তারিখে ফিরে -> (১১ অক্টোবর ২০১৪) আরে অপেক্ষা কি?
পিটার বি

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

23

এটি তিনটি প্রধান কারণে খারাপ:

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

আমি সন্দেহ করি কারণ 1 হ'ল কারণটি আপনার উত্সটি যে প্রসঙ্গে উল্লেখ করা হয়েছিল তার উপর ভিত্তি করে ভাবছিলেন।


6

আমি বর্ণনাকে পুনরায় লিখব "কোড যা কোনও প্রকারকে ভিন্ন উপস্থাপনে রূপান্তরিত করে এমন কিছু করার উদ্দেশ্যে যা মূলতে আরও ভাল বা আরও ভাল করা যেতে পারে এবং তারপরে এটি আবার রূপান্তর করে There এমন অনেক পরিস্থিতি রয়েছে যেখানে কোনও কিছুতে রূপান্তরিত হয় something বিভিন্ন ধরণের, এটিতে অভিনয় করা এবং এটিকে আবার রূপান্তর করা পুরোপুরি উপযুক্ত এবং এটির ব্যর্থতা ভুল আচরণের ফলস্বরূপ।

উদাহরণ হিসাবে যেখানে রূপান্তর ভাল:
একের মধ্যে চারটি floatমান স্বেচ্ছাসেবী চিহ্ন রয়েছে যার দৈর্ঘ্য এক হাজার পর্যন্ত ফ্যাক্টর দ্বারা পৃথক হতে পারে এবং শেষের স্থানে 0.625 ইউনিটের মধ্যে একটিকে অঙ্ক করতে হবে। চারটি মানকে রূপান্তর করা double, সমষ্টিটি গণনা করা, এবং ফলাফলকে আবার রূপান্তর করা floatব্যবহারের যে কোনও পদ্ধতির চেয়ে অনেক বেশি কার্যকর হবেfloat একা ।
শেষ স্থানে (ইউএলপি) সর্বনিম্ন পয়েন্টের মানগুলি যথাযথভাবে 0.5 ইউনিট অবধি থাকে। এই উদাহরণটির প্রয়োজন হবে যে সবচেয়ে খারাপের ক্ষেত্রে সবচেয়ে বেশি খারাপের ক্ষেত্রে ত্রুটিটি 25% এর বেশি হবে না by একটি ডাবল ব্যবহার করে একটি মান আসবে যা 0.5001 ইউএলপি-র মধ্যে সঠিক হবে। যদিও 0.625 ইউএলপি প্রয়োজনীয়তাটি সংবিধানযুক্ত মনে হতে পারে, ক্রম-অনুমানের অ্যালগরিদমে এই জাতীয় প্রয়োজনীয়তা প্রায়শই গুরুত্বপূর্ণ। ত্রুটিটির আবদ্ধতাটি আরও তীব্রভাবে সুনির্দিষ্টভাবে চিহ্নিত করা হবে, সবচেয়ে খারাপের ক্ষেত্রে পুনরাবৃত্তির প্রয়োজন কম হবে।

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

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

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

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


1
আপনার উদাহরণটি মূল মানটি দেয় না যা ওপি যা জিজ্ঞাসা করছে। এটি কেবল একই ধরণের সাথে একাধিক ইনপুট থেকে গণনা করে মান দেয়।
সিজে ডেনিস

2

বিবিধ কারণবশত

  1. এটি অর্থহীন এবং জটিলতা যুক্ত করে - উভয়ই লেখার এবং বজায় রাখার কোডের পরিমাণ এবং সিপিইউ সময়ের পরিমাণ প্রয়োজন

    1. এটি নির্ভুলতা বা খারাপ ক্ষতি হারাতে পারে, মানটিকে পুরোপুরি দূষিত করে

    2. আপনার প্রয়োজনীয় সংখ্যার আরও উপস্থাপনা সংরক্ষণ করার সাথে সাথে এটি মেমোরির অপচয় (সম্ভাব্য, ভাষার উপর নির্ভর করে) করে

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


এই কিছু তৈরি পয়েন্ট উপর সারগর্ভ যোগ করার জন্য বলে মনে হচ্ছে না এবং পূর্বে উত্তর ব্যাখ্যা
মশা

2
এটি কি কোনও ভোটকে ন্যায্যতা দেয়? আমি বিশ্বাস করি যে আমার পোস্টটি সম্ভাব্যভাবে আরও সংক্ষিপ্ত
জোন স্টোরি

পূর্বে উত্তর আসলে তাদের আমার আরো সংক্ষিপ্ত চেহারা, উভয়
মশা

0

কেন? কারণ আমাদের মধ্যে সেরাও ভুল করতে পারে।

মাইক্রোসফ্ট যখন "ভ্রমন-ট্রিপ" ফর্ম্যাটটি বিশেষত ভাসমান নিশ্চিত করার জন্য বিশেষভাবে প্রয়োগ করার চেষ্টা করেছিল তখন দেখুন </> স্ট্রিং রূপান্তরগুলি নিরাপদ ছিল: https://stackoverflow.com/q/24299692/541686


0

আমি যখন স্কুলে ছিলাম (এবং বৈদ্যুতিক প্রকৌশল বিভাগে পোস্ট স্কুল) তখন আমাদের গুণমানের পরে ভাগ করতে শেখানো হয়েছিল। বিভাগ প্রায়শই বহু অঙ্ক এবং গোল হয়। বিভাগের পরে গুণিত করা বিভাগ ত্রুটিটিকে বহুগুণ করে।

প্রকার রূপান্তরগুলি একই, আপনি ডেটা হারাতে ঝুঁকিপূর্ণ। সিআইএনটি (1.3) = 1।

আমার ভাষায়, বেসিক, আমরা কেবল টাইপ রূপান্তরগুলি করি (একটি ভিবি 6 প্রোগ্রাম এএনএসআই / ইউনিকোড রূপান্তর করতে 90% সময় ব্যয় করে, কারণ সমস্ত এপিআই কল রানটাইম তৈরি করে)।

প্রকার রূপান্তর আমাদের সমস্ত কিছুতে অন্তর্ভুক্ত।

 Print 5

"5" স্ট্রিংটি সংখ্যাগত আক্ষরিক থেকে মুদ্রিত হয়।

form1.caption = "My Form"

ইউনিকোড স্ট্রিং আক্ষরিক একটি এএনএসআই স্ট্রিংয়ে রূপান্তরিত হয় এবং ফর্ম প্যাকেজটির মাধ্যমে সেট উইন্ডোস টেক্সটএতে প্রেরণ করা হয়।

এমনকি এটি মৌলিকভাবে কাজ করে

a = "5"
b = 3

c = a + b (= 8)

আমি আজকাল একটি বৈকল্পিক প্রোগ্রামার - আমি এমনকি টাইপ সম্পর্কে ভাবি না। আমি কেবল স্বায়ত্তর পরিবর্তনের উপর নির্ভর করি।

যাইহোক আমার 3 পোষা peeves হয়

ভেরিয়েবলগুলি ব্যবহার করার জন্য স্ট্রিং আক্ষরিক অর্পণ করা (মেমরি এবং ধীর অপচয় হয়)

কোড যখন ইনলাইন হতে পারে তখন অর্থহীন ফাংশন (এবং সংকলক সম্ভবত আপনার ফাংশনটিকে পূর্বাবস্থায় ফিরিয়ে আনবে এবং যাইহোক এটি ইনলাইন করবে)

একটি শেষ ফাংশন বা প্রোগ্রামের শেষের আগে সমস্ত অবজেক্টকে সর্বশেষ লাইন হিসাবে সেট করা।

সংক্ষিপ্ত প্রোগ্রামের জন্য একটি চতুর্থ

5 লাইনের প্রোগ্রামে আপনার 3 ভেরিয়েবলকে অর্থহীনভাবে ম্লান করে দেওয়া।

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