কেন "যদি অন্য কেউ হয়" বিবৃতিগুলি কার্যত টেবিলে বিন্যাসে হয় না?


73
if   i>0 : return sqrt(i)  
elif i==0: return 0  
else     : return 1j * sqrt(-i)

বনাম

if i>0:  
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

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

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


91
কারণ লোকেরা ২ য় বিকল্পটি আরও পঠনযোগ্য বলে মনে করে?
গ্র্যান্ডমাস্টারবি

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

47
@horta "একমাত্র ক্ষেত্রে যেখানে সমস্যা হতে পারে তা হ'ল কোড পরিবর্তন হয় এবং দীর্ঘ হয়" " - তুমি উচিত কখনও অনুমান যে কোড এক টুকরা পরিবর্তন করা যাবে না। কোড রিফ্যাক্টরিং একটি সফ্টওয়্যারটির জীবনচক্রের একটি বৃহত অংশ গ্রহণ করে।
চার্লস অ্যাডিস

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

44
এছাড়াও, বেশিরভাগ ডিবাগারগুলি লাইন ভিত্তিক। ifযদি একই লাইনে থাকে তবে এটির ভিতরে থাকা একটি বিবৃতিতে কোনও ব্রেকপয়েন্ট রাখতে পারবেন না ।
ইসানানে

উত্তর:


93

এর একটি কারণ হতে পারে যে আপনি যেখানে ভাষা জনপ্রিয় সেখানে ব্যবহার করছেন না।

কয়েকটি পাল্টা উদাহরণ:

প্রহরী এবং নিদর্শন সহ হাস্কেল:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1

take  0     _           =  []
take  _     []          =  []
take  n     (x:xs)      =  x : take (n-1) xs

নিদর্শন সহ ত্রুটিযুক্ত:

insert(X,Set) ->
    case lists:member(X,Set) of
        true  -> Set;
        false -> [X|Set]
    end.

ইমাস লিসপ:

(pcase (get-return-code x)
  (`success       (message "Done!"))
  (`would-block   (message "Sorry, can't do it now"))
  (`read-only     (message "The shmliblick is read-only"))
  (`access-denied (message "You do not have the needed rights"))
  (code           (message "Unknown return code %S" code)))

সাধারণত আমি দেখতে পাই টেবিল বিন্যাসটি কার্যকরী ভাষাগুলিতে (এবং সাধারণ অভিব্যক্তিভিত্তিক ভিত্তিতে) বেশ জনপ্রিয়, অন্যদিকে লাইনগুলি ভেঙে সর্বাধিক জনপ্রিয় (বেশিরভাগ বিবৃতি ভিত্তিক)।


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

3
@ জারেডস্মিথ প্রকাশ / বিবৃতি ভিত্তিক বিভাজনের জন্য ধন্যবাদ - আমি মনে করি এটি কার্যকরী / অপরিহার্যতার চেয়ে আরও উপযুক্ত হতে পারে। রুবীর চেয়ে প্রায় প্রায় অভিব্যক্তিভিত্তিক এবং প্রায়শই এই সম্মেলনটি ব্যবহার করে না। (সমস্ত কিছুর ব্যতিক্রম) পয়েন্ট 1 এবং 2 সম্পর্কিত, আমি 50% + রিয়েল হাস্কেল কোডকে "তুচ্ছ রিটার্ন" হতে দেখি যা কিছু বড় কিছু মাত্র - এটি কোডটি কীভাবে লেখা হয় - কেবল উদাহরণ হিসাবে এখানে নেই। উদাহরণস্বরূপ, এখানে প্রায় অর্ধেক কার্যকারিতা কেবলমাত্র এক / দুটি লাইনার। (কিছু লাইন টেবিল বিন্যাস ব্যবহার করে)
ভাইরাপটার

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

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

@ ভাইরাপটর প্রযুক্তিগতভাবে অন্যান্য ৫০% হ্যাশেল কোড হ'ল "নন-তুচ্ছ রিটার্ন" কারণ সমস্ত হাস্কেল ফাংশন কার্যত খাঁটি এবং এর পার্শ্ব প্রতিক্রিয়া থাকতে পারে না। এমনকি ফাংশনগুলি যা কমান্ড লাইনে থেকে পড়ে এবং মুদ্রণ করে তা কেবল দীর্ঘ দীর্ঘ বিবৃতি।
ফারাপ

134

এটি আরও পঠনযোগ্য। কয়েকটি কারণ কেন:

  • প্রায় প্রতিটি ভাষা এই বাক্য গঠন ব্যবহার করে (সমস্ত নয়, বেশিরভাগ - আপনার উদাহরণটি পাইথন বলে মনে হয়, যদিও)
  • ইসানা এক মন্তব্যে উল্লেখ করেছেন যে বেশিরভাগ ডিবাগারগুলি লাইন ভিত্তিক (বিবৃতি ভিত্তিক নয়)
  • আপনার যদি সেমিকোলন বা ধনুর্বন্ধনীগুলি ইনলাইন করতে হয় তবে এটি আরও কদর্য দেখা শুরু করে
  • এটি আরও সহজভাবে উপরে থেকে নীচে পড়ে
  • আপনার কাছে তুচ্ছ রিটার্নের স্টেটমেন্ট ব্যতীত অন্য কিছু থাকলে এটি মারাত্মকভাবে অপঠনযোগ্য বলে মনে হচ্ছে
    • শর্তসাপেক্ষ কোডটি দৃশ্যমানভাবে আর আলাদা করা হয়নি ( ড্যান নীলি থেকে ) আপনি যে কোনও ইনডেন্টিং অর্থপূর্ণ সিনট্যাক্স নষ্ট হয়ে যান code
    • যদি আপনি বিবৃতিগুলি 1-লাইনে আইটেমগুলি প্যাচ / যুক্ত করে চালিয়ে যান তবে এটি বিশেষত খারাপ হবে
  • যদি আপনার সমস্ত চেক একই দৈর্ঘ্যের হয় তবে এটি কেবল পঠনযোগ্য
  • এর মানে আপনি জটিল ফরম্যাট করতে না পরেন তাহলে একাধিক লাইন বিবৃতি মধ্যে বিবৃতি, তারা হবে আছে oneliners হতে
  • লম্বালম্বিভাবে লাইন লাইন পড়তে গিয়ে একাধিক লাইন একসাথে বিশ্লেষণ করার চেষ্টা না করে আমি বাগ / লজিকফ্লো লক্ষ্য করার সম্ভাবনা অনেক বেশি
  • আমাদের মস্তিষ্কগুলি দীর্ঘ, অনুভূমিক পাঠ্যের চেয়ে আরও দীর্ঘতর সঙ্কুচিত, লম্বা পাঠ্য পাঠ করে

আপনি যে কোনও কিছু করার চেষ্টা করার মুহুর্তে আপনি এটি মাল্টলাইন স্টেটমেন্টগুলিতে পুনরায় লেখা শুরু করবেন। যার অর্থ আপনি স্রেফ সময় নষ্ট করেছেন!

এছাড়াও লোকেরা অনিবার্যভাবে এমন কিছু যুক্ত করে:

if i>0:  
   print('foobar')
   return sqrt(i)  
elif i==0:  
   return 0  
else:  
   return 1j * sqrt(-i)  

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

অথবা এটা:

if   i>0 : return sqrt(i)  
elif i==0 and bar==0: return 0  
else     : return 1j * sqrt(-i)

যা সত্যই সত্যই বিরক্তিকর। কেউ এই ধরণের জিনিস বিন্যাস পছন্দ করে না।

এবং সর্বশেষে, আপনি "ট্যাবগুলির জন্য কত স্পেস" সমস্যার পবিত্র যুদ্ধ শুরু করবেন। টেবিল বিন্যাস হিসাবে আপনার স্ক্রিনে যা নিখুঁতভাবে রেন্ডার করে সেটি সেটিংসের উপর নির্ভর করে আমার উপর রেন্ডার হতে পারে না।

পঠনযোগ্যতা যাইহোক আইডিই সেটিংসের উপর নির্ভর করবে না।


14
@ হর্টা কারণ আপনি প্রথমে এটি ফর্ম্যাট করেন তবে আপনাকে এটি রূপান্তর করতে হবে ? আমি ভবিষ্যতের এন্টারল্যান্ডের কাজ কমিয়ে আনার বিষয়ে আছি। ভিজ্যুয়াল ফর্ম্যাটিং আপডেট করার জন্য সুন্দর হোয়াইটস্পেস টেবিল তৈরি এবং স্পেস এবং ট্যাবগুলি গণনা করা হচ্ছে যখন আমি কোনও যুক্তি যুক্ত করতে পারি যদি চেক মোটেও মজাদার না হয় (পঠনযোগ্যতার প্রভাবগুলি উপেক্ষা করে)।
এন্ডারল্যান্ড

14
@ হর্টা তিনি অগত্যা বলছেন না যে তিনি এটিকে ঠিক করবেন না, তিনি বলছেন যে এটি ঠিক করতে হবে এবং প্রোগ্রামিংয়ের পরিবর্তে ক্লান্তিকর ফর্ম্যাটিংয়ের জন্য এটি অনেক সময় ব্যয় করেছে।
পরিবেশন করুন

11
@ হর্টা: আইএমএইচও আপনার উপায় প্রায়শই কম পঠনযোগ্য এবং ফর্ম্যাট করতে অবশ্যই অনেক বেশি বিরক্তিকর। এছাড়াও, এটি তখনই ব্যবহার করা যেতে পারে যখন "ifs" ছোট্ট একটি লাইনার থাকে, যা খুব কমই দেখা যায়। শেষ অবধি, আইএমএইচও, এই কারণে প্রায় দুই ধরণের "যদি" ফর্ম্যাটিং বহন করে, এটি কোনওভাবেই দুর্দান্ত নয়।
26:56

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

11
আমি যুক্ত করলাম: একক অবস্থায় যে কোনও ছোট পরিবর্তন হতে পারে অন্যদের পুনরায় ফর্ম্যাট করে :পজিশনের সাথে মেলে -> কোনও সিভিএসে ভিন্নতা আনতে হঠাৎ বুঝতে অসুবিধে হয় যে আসলে কী পরিবর্তনশীল। শর্ত বনাম শরীরের ক্ষেত্রে এটিও সত্য। তাদের পৃথক লাইনে থাকার অর্থ এই যে আপনি যদি তাদের মধ্যে কেবল একটির পরিবর্তন করেন তবে স্পষ্টভাবে বোঝা যায় যে কেবলমাত্র অবস্থার পরিবর্তন হয়েছে, শরীর নয়।
বাকুরিউ

55

আমি দৃ firm় বিশ্বাসী 'কোড বহুবার পঠিত হয়, কয়েকটি লিখিত হয় - তাই পাঠযোগ্যতা খুব গুরুত্বপূর্ণ।'

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


3
প্রাসঙ্গিক: thecodelesscode.com/case/94
কেভিন

11
এটি ব্যাখ্যা করে যে লোকেরা কেন রক্ষণশীল। লোকেরা কেন তাদের কোডটি শুরু করার জন্য একটি নির্দিষ্ট উপায়ে লিখতে পছন্দ করেছিল তা ব্যাখ্যা করে না।
জর্জেন ফাগ

8
প্রশ্নটি ছিল 'আমি কেন প্রায়ই এটি দেখি', এই স্টাইলটি কোথা থেকে আসেনি। উভয় প্রশ্ন আকর্ষণীয়; আমি যা ভেবেছিলাম তার উত্তর দেওয়ার চেষ্টা করেছি।
আর্ট সোরি

16

ইতিমধ্যে উল্লিখিত অন্যান্য ত্রুটিগুলির পাশাপাশি, সারণী বিন্যাসটি ম্যানুয়াল হস্তক্ষেপের প্রয়োজন সংস্করণ নিয়ন্ত্রণ মার্জ সংঘাতগুলির প্রতিক্রিয়া বাড়িয়ে তোলে।

যখন ট্যাবুলার্যযুক্ত অ্যালাইনড কোডের একটি ব্লককে সত্যায়িত করা দরকার, সংস্করণ নিয়ন্ত্রণ ব্যবস্থা সেই লাইনগুলির প্রতিটিটিকে সংশোধিত হিসাবে গণ্য করবে:

diff --git a/foo.rb b/foo.rb
index 40f7833..694d8fe 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,8 +1,8 @@
 class Foo

   def initialize(options)
-    @cached_metadata = options[:metadata]
-    @logger          = options[:logger]
+    @metadata = options[:metadata]
+    @logger   = options[:logger]
   end

 end

এখন ধরুন যে গড় সময়ে, অন্য একটি শাখায়, একজন প্রোগ্রামার প্রান্তিককরণের কোডটিতে একটি নতুন লাইন যুক্ত করেছে:

diff --git a/foo.rb b/foo.rb
index 40f7833..86648cb 100644
--- a/foo.rb
+++ b/foo.rb
@@ -3,6 +3,7 @@ class Foo
   def initialize(options)
     @cached_metadata = options[:metadata]
     @logger          = options[:logger]
+    @kittens         = options[:kittens]
   end

 end

শাখাটি মার্জ করা ব্যর্থ হবে:

wayne@mercury:/tmp/foo$ git merge add_kittens
Auto-merging foo.rb
CONFLICT (content): Merge conflict in foo.rb
Automatic merge failed; fix conflicts and then commit the result.

কোডটি সংশোধন করা হচ্ছে যদি টেবুলার প্রান্তিককরণ ব্যবহার না করা হত তবে মার্জটি স্বয়ংক্রিয়ভাবে সফল হত।

(এই উত্তরটি আমার নিজের নিবন্ধের কোডটিতে টেবুলার প্রান্তিককরণকে নিরুৎসাহিত করে "চুরি করা" হয়েছিল )।


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

7
@horta মার্জ টুলটি এমনভাবে শ্বেত স্থান পরিবর্তন করার জন্য যা প্রায়শই কোড ভঙ্গ করে না, কোডের অর্থ পরিবর্তন না করে কীভাবে এটি সাদা স্থান পরিবর্তন করতে পারে তা বুঝতে হবে। এটি নির্দিষ্ট ট্যাবুলার প্রান্তিককরণটি ব্যবহৃত হচ্ছে তাও বুঝতে হবে। এটি কেবলমাত্র ভাষা নির্ভর (পাইথন!) নয়, সম্ভবত কোডটি কিছুটা ডিগ্রী বোঝার জন্য সরঞ্জামটির প্রয়োজন। অন্যদিকে, লাইন ভিত্তিক একত্রিতকরণ এআই ছাড়া করা যেতে পারে এবং প্রায়শই কোডটি ভঙ্গ করে না।
ওয়েইন কনরাড

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

1
@ হার্টা সঠিক কোডে ট্যাবুলার প্রান্তিককরণের বিষয়ে আমার বেশিরভাগ আপত্তি পর্যাপ্ত উন্নত সরঞ্জামগুলির সাথে সরে যেতে পারে।
ওয়েইন কনরাড

8

বরাদ্দকৃত প্রস্থের মধ্যে জিনিসগুলি সর্বদা মানানসই হলে সারণী বিন্যাসগুলি খুব সুন্দর হতে পারে। যদি কিছু বরাদ্দিত প্রস্থের চেয়ে বেশি হয়ে যায় তবে তবে প্রায়শই হয় হয় টেবিলের অংশটি বাকী অংশের সাথে রেখাযুক্ত না হওয়া বা অন্য কোনও দীর্ঘ আইটেমের সাথে মেলে টেবিলের সমস্ত কিছুর বিন্যাস সামঞ্জস্য করা প্রয়োজন হয়ে পড়ে becomes ।

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


সত্য। আমি লক্ষ্য করেছি যে আমি যে টেক্সট সম্পাদকটি ব্যবহার করি (ভিআইএম) এর সারণী বিন্যাস বা বিস্তৃত পাঠ্যের জন্য ভয়ঙ্কর সমর্থন রয়েছে। আমি অন্য পাঠ্য-সম্পাদকরা আরও ভাল কিছু করতে দেখিনি।
হর্টা

6

এখানে 'স্যুইচ' বিবৃতি রয়েছে যা বিশেষ ধরণের ক্ষেত্রে এই জাতীয় জিনিস সরবরাহ করে তবে আমি অনুমান করি যে এটি আপনি যা জিজ্ঞাসা করছেন তা নয়।

আমি টেবিল বিন্যাসে বিবৃতিগুলি দেখেছি, তবে এটি সার্থক করার জন্য প্রচুর শর্ত থাকতে হবে। 3 যদি বিবৃতিগুলি traditionalতিহ্যগত ফর্ম্যাটে সেরা দেখানো হয় তবে আপনার যদি 20 টি থাকে তবে এটি পরিষ্কার করার জন্য ফর্ম্যাট করা বড় ব্লকে তাদের প্রদর্শন করা আরও সহজ।

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


1
ওপি পাইথন ব্যবহার করছে বলে মনে হচ্ছে, তাই না switch
জারেড স্মিথ

2
"3 যদি statementsতিহ্যগত ফর্ম্যাটে বিবৃতিগুলি সর্বোত্তমভাবে দেখানো হয় তবে আপনার যদি 20" থাকে ... তবে আপনার আরও বড় বিষয়গুলি নিয়ে ভাবতে হবে! :)
গ্রিম দ্য ওপেনার

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

@ জ্যারেডস্মিথ: আপাতদৃষ্টিতে switchমন্দ, কিন্তু তুচ্ছ শাখা প্রশাখার জন্য কোনও অভিধানে তত্পরতার সাথে তদন্ত করা খারাপ নয় ...
মার্ক কে কোয়ান

1
@ মারককোয়ান ওহ আমি কটূক্তিটি ধরলাম কিন্তু ভেবেছিলাম আপনি এটি আমাকে উপহাস করার জন্য ব্যবহার করছেন। ইন্টারনেটে প্রসঙ্গের অভাব এবং কী নয়।
জ্যারেড স্মিথ

1

যদি আপনার অভিব্যক্তি সত্যিই সহজ হয় তবে বেশিরভাগ প্রোগ্রামিং ভাষাগুলি?: ব্রাঞ্চিং অপারেটরটি সরবরাহ করে:

return  ( i > 0  ) ? sqrt( i)
      : ( i == 0 ) ? 0
        /* else */ : 1j * sqrt( -i )

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

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

if ( i > 0 )
{
    throw new InvalidInputException(...);
}
else if ( i == 0 )
{
    return 0;
}
else
{
    log( "Calculating sqrt" );
    return sqrt( -i );
}

7
আসলে, আমি আপনার "স্বল্প পাঠযোগ্য টেবুলার ফর্ম্যাট "টি পড়ার জন্য বেশ দুঃস্বপ্ন দেখতে পাই, যখন ওপি কর্তৃক প্রস্তাবিত ফর্ম্যাটটি পুরোপুরি ঠিক।
মাত্তেও ইটালিয়া

@ মাত্তিও ইটালিয়া এই সম্পাদিত সংস্করণটি সম্পর্কে কীভাবে?
ফ্যালকো

5
দুঃখিত, আরও খারাপ; আমি মনে করি যে এটি / কিওয়ার্ডের চেয়ে এবং এবং বা প্রতীকগুলির "যোগ" শব্দের কারণে স্পট করা শক্ত ?এবং এ থেকে সত্যই আসে :are ifelse
মাত্তেও ইটালিয়া

@ মাত্তিও ইটালিয়া: আমার শতাধিক ভিন্ন মান রয়েছে। সারণির মান ত্রুটিগুলি পরীক্ষা করা সম্ভব করে। বহু-লাইন সহ, এটি অসম্ভব।
gnasher729

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

1

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

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

কোডিংয়ের মানগুলি প্রায়শই সম্বোধন করে এমন একটি জনপ্রিয় ত্রুটি হ'ল এই ছোট্ট গোচা: -

if (x == 10)
    do_something();
    do_something_else();

এটি আপনি যা ভাবেন তা করে না। যতদূর সি সম্পর্কিত, X যদি 10 হয় তবে আপনি কল করেন do_something()তবে x এর মান নির্বিশেষেdo_something_else() ডেকে আনা হবে । "যদি" বিবৃতিটি অবিলম্বে অনুসরণ করা কেবলমাত্র পদক্ষেপ শর্তযুক্ত। কোডার এটির উদ্দেশ্য হতে পারে, এক্ষেত্রে রক্ষণাবেক্ষণকারীদের জন্য একটি সম্ভাব্য ফাঁদ রয়েছে; অথবা কোডারটি যা ইচ্ছা করেছিল তা নাও হতে পারে, এক্ষেত্রে বাগ রয়েছে। এটি একটি জনপ্রিয় সাক্ষাত্কারের প্রশ্ন।

কোডিং মানগুলির সমাধান হ'ল সমস্ত শর্তাধীন ক্রিয়াকলাপগুলির কাছাকাছি ধনুর্বন্ধনী হ্যান্ডসেট করা, এমনকি তারা একক-লাইন হলেও। আমরা এখন পেতে

if (x == 10)
{
    do_something();
    do_something_else();
}

অথবা

if (x == 10)
{
    do_something();
}
do_something_else();

এবং এখন এটি সঠিকভাবে কাজ করে এবং রক্ষণাবেক্ষণকারীদের পক্ষে এটি পরিষ্কার।

আপনি লক্ষ্য করবেন যে এটি আপনার টেবিল-স্টাইল বিন্যাসের সাথে সম্পূর্ণ বেমানান।

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

if x == 10:
    do_something()
    do_something_else()

x == 10 এ উভয়কে কল do_something()এবং do_something_else()শর্তসাপেক্ষে কল করে

if x == 10:
    do_something()
do_something_else()

এর অর্থ এটি কেবলমাত্র do_something()এক্স এর শর্তসাপেক্ষ এবং do_something_else()সর্বদা বলা হয়।

এটি একটি বৈধ ধারণা এবং আপনি কয়েকটি ভাষায় এটি ব্যবহার করতে পারেন। (আমি প্রথমে এটি ওকেড 2 এ দেখেছি, যখন ফিরে আসি)


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

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

2
আমার বক্তব্যটি এটি একটি টেবিল ফর্ম্যাটটিকে আরও বিশৃঙ্খল করে তোলে। ঘটনাক্রমে, এটি সি-নির্দিষ্ট নয় - এটি সি থেকে প্রাপ্ত সমস্ত ভাষা দ্বারা ভাগ করা হয়েছে, সুতরাং সি ++, সি #, জাভা এবং জাভাস্ক্রিপ্ট সমস্ত একই গোটার অনুমতি দেয়।
গ্রাহাম

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

1

সারণী বিন্যাস কয়েকটি সীমাবদ্ধ ক্ষেত্রে কার্যকর হতে পারে তবে এটির ক্ষেত্রে কয়েকবার কার্যকর হয়।

সাধারণ ক্ষেত্রে?: আরও ভাল পছন্দ হতে পারে। মাঝারি ক্ষেত্রে একটি স্যুইচ প্রায়শই একটি ভাল ফিট (যদি আপনার ভাষার একটি থাকে)। জটিল ক্ষেত্রে আপনি দেখতে পাবেন যে কল টেবিলগুলি আরও ভাল ফিট।

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

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

if i==0: return 0
return i>0?sqrt(i):(1j*sqrt(-i))

1
আপনাকে এটি পরিষ্কার করতে হবে যে "?:" নিরবচ্ছিন্নদের জন্য (উদাহরণস্বরূপ, উদাহরণ সহ সম্ভবত প্রশ্নের সাথে সম্পর্কিত)।
পিটার মর্টেনসেন

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

@ পিটারমোরটেনসেন: যদি অজ্ঞাতপরিচিত ব্যক্তিরা এর অর্থ কী তা যদি না জেনে থাকে তবে তারা স্পষ্ট প্রশ্ন জিজ্ঞাসা না করে এবং শেখ না হওয়া অবধি তাদের কোড থেকে দূরে থাকা উচিত stay
gnasher729

@ হার্টা টেরনারী if ? do stuff : do other stuff। যদি / অন্য হিসাবে একই আদেশ।
নবীন

1
@ নাভিন আহ, সম্ভবত আমি যে ভাষার বেশিরভাগ ব্যবহার করি (পাইথন) এটি কেবলমাত্র একটি ব্যর্থতা। stackoverflow.com/questions/394809/…
horta

-3

আমি টেবিল বিন্যাসে কোনও ভুল দেখছি না। ব্যক্তিগত পছন্দ, তবে আমি এর মতো একটি টের্নারি ব্যবহার করব:

return i>0  ? sqrt(i)       :
       i==0 ? 0             :
              1j * sqrt(-i)

returnপ্রতিবার পুনরাবৃত্তি করার প্রয়োজন নেই :)


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

পাইথন টেরিনারিগুলি হয় do_something() if condition() else do_something_else()না condition() ? do_something() : do_something_else()
ইসিয়া মিডোস

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