পাঠযোগ্য ক্লোজার কোড কীভাবে লিখবেন?


13

আমি ক্লোজুরে নতুন আমি যে কোডটি লিখছি তা বুঝতে পারি তবে পরে এটি বোঝা খুব কঠিন হয়ে যায়।
প্রথম বন্ধনীর সাথে ম্যাচ করা কঠিন হয়ে পড়ে।

নামকরণ কনভেনশন এবং বিভিন্ন পরিস্থিতিতে ইন্ডেন্টেশন সম্পর্কিত জেনেরিক কনভেনশনগুলি কী?

উদাহরণস্বরূপ আমি বুঝতে একটি নমুনা ডি-স্ট্রাকচারিং উদাহরণ লিখেছি তবে এটি দ্বিতীয়বার সম্পূর্ণ অপঠনীয় বলে মনে হচ্ছে।

(defn f [{x :x y :y z :z [a b c] :coll}] (print x " " y  " " z " " a " " b " " c)) 

ডি-স্ট্রাকচারিংয়ের ক্ষেত্রে, প্যারামিটার স্তরে সরাসরি এটি করা বা একটি লেট ফর্মটি শুরু করা এবং তারপরে সেখানে চালিয়ে যাওয়া কি ভাল?


3
স্ট্যাক ওভারফ্লোতে পঠনযোগ্যতা সম্পর্কে একটি ভাল উত্তর আছে। আপনি এটা চেক আউট করতে পারেন। stackoverflow.com/a/1894891/1969106
yfklon

2
পঠনযোগ্য লিস্প কোড লেখা সাধারণভাবে কঠিন। তারা একটি কারণের জন্য "লস্ট ইন সুপারফ্লুয়াস পেরেন্টেসিস" ব্যাক্রোনিয়াম আবিষ্কার করেছিলেন।
ম্যাসন হুইলারের

উত্তর:


23

নামকরণ অনুষ্ঠান

  • ফাংশন জন্য ছোট হাত থাকুন
  • -হাইফেনেশনের জন্য ব্যবহার করুন (অন্যান্য ভাষায় আন্ডারস্কোর বা উটের ক্ষেত্রে কী হবে)।

    (defn add-one [i] (inc i))

  • পূর্বাভাস (উদাহরণস্বরূপ ফাংশনগুলি সত্য বা মিথ্যা প্রত্যাবর্তন) শেষ হয় ? :odd? even? nil? empty?

  • রাজ্য পরিবর্তনের পদ্ধতি শেষ !set!ঠিক মনে আছে? অথবাswap!

  • তাদের নাগালের উপর নির্ভর করে সংক্ষিপ্ত পরিবর্তনশীল নামের দৈর্ঘ্য চয়ন করুন। এর অর্থ যদি আপনার যদি খুব ছোট অক্জিলিয়ারি ভেরিয়েবল থাকে তবে আপনি প্রায়শই কেবলমাত্র একটি-অক্ষরের নাম ব্যবহার করতে পারেন। (map (fn [[k v]] (inc v)) {:test 4 :blub 5})প্রয়োজন মতো দীর্ঘতর পরিবর্তনশীল নামগুলি বেছে নিন, বিশেষত যদি সেগুলি প্রচুর কোড লাইনের জন্য ব্যবহৃত হয় এবং আপনি তাত্ক্ষণিকভাবে তাদের উদ্দেশ্য অনুমান করতে পারবেন না। (আমার মতামত).

    আমি অনুভব করি যে প্রচুর ক্লোজার প্রোগ্রামাররা জেনেরিক এবং সংক্ষিপ্ত নামগুলি ব্যবহার করার প্রবণতা রাখে। তবে এটি অবশ্যই বস্তুনিষ্ঠ পর্যবেক্ষণ নয়। মুল বক্তব্যটি হ'ল প্রচুর ক্লোজার ফাংশন আসলে বেশ জেনেরিক।

    • অর্থপূর্ণ নাম ব্যবহার করুন Use প্রসেসারগুলি কিছু করছে, এর জন্য আপনি ক্রিয়াগুলি ব্যবহার করে সেগুলি সর্বোত্তমভাবে বর্ণনা করতে পারেন। Clojure বিল্ট-ইন ফাংশন ঠিক দিকে যাচ্ছে আপনি করা উচিত: drop, take, assoc:, ইত্যাদি তারপর একটি চমৎকার নিবন্ধ একটি অর্থপূর্ণ নাম চয়ন করার উপায় বর্ণনা করা হয়েছে http://ecmendenhall.github.io/blog/blog/2013/09/ 02 / ক্লিন-clojure-অর্থপূর্ণ-নাম /

লাম্বদা ফাংশন

  • আপনি আসলে ল্যাম্বদা ফাংশনগুলির নাম দিতে পারেন। এটি ডিবাগিং এবং প্রোফাইলিংয়ের জন্য সুবিধাজনক (আমার অভিজ্ঞতা এখানে ক্লোজার স্ক্রিপ্ট সহ)।

    (fn square-em [[k v]] {k (* v v)})

  • #()সুবিধাজনক হিসাবে ইনলাইন ল্যাম্বদা ফাংশন ব্যবহার করুন

সাদা ব্যবধান

  • প্যারেন্স-কেবল লাইন থাকা উচিত নয়। অর্থাৎ এখনই বন্ধনী বন্ধ করুন। মনে রাখবেন প্যারেনস সম্পাদক এবং সংকলকের জন্য রয়েছে, ইনডেন্টেশনটি আপনার জন্য।

  • ফাংশন প্যারামিটারের তালিকাগুলি একটি নতুন লাইনে যায়

   (defn cons)
     [AB]
     (তালিকা আবশ্যক)

আপনি যদি ডক স্ট্রিং সম্পর্কে চিন্তা করেন তবে এটি অর্থবোধ করে। এগুলি ফাংশনের নাম এবং পরামিতিগুলির মধ্যে রয়েছে। নিম্নলিখিত ডক স্ট্রিং সম্ভবত বুদ্ধিমান নয়;)

   (defn cons)
     "জিনিসগুলিকে যুক্ত করা"
     [AB]
     (তালিকা আবশ্যক)
  • জোড় করা ডেটা যতক্ষণ আপনি জোড়টি ধরে রাখবেন ততক্ষণ নতুন লাইনের দ্বারা পৃথক করা যায়
  (ডিফএন চ 
    [{x: x 
      y: y 
      z: z  
      [এবিসি]: সংঘর্ষ}] 
    (প্রিন্ট x "" y "" জেড "" এ "" বি "" সি)) 

(আপনি নিজের ,পছন্দ মতো প্রবেশও করতে পারেন তবে এটি অস্বচ্ছন্দ বোধ করে)।

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

    কমান্ড মোডের ভিমে আপনি কমান্ডটি =সঠিকভাবে ইনডেন্ট করতে পারেন ।

  • যদি কমান্ডটি খুব দীর্ঘ হয় (নেস্টেড, ইত্যাদি) আপনি প্রথম যুক্তির পরে একটি নতুন লাইন canোকাতে পারেন। এখন নীচের কোডটি বেশ বুদ্ধিমান তবে এটি আপনাকে কীভাবে গোষ্ঠীভুক্ত করতে এবং ইনডেন্ট এক্সপ্রেশনগুলি ব্যাখ্যা করতে পারে:

(+ (যদি-দেওয়া [বয়স (: ব্যক্তিগত-বয়স সংঘর্ষ))]
     (যদি (> বয়স 18)
       বয়স
       0))
   (গণনা (পরিসর (- 3 খ))
                 (হ্রাস +) 
                         (পরিসর বি 10%))))

ভাল ইন্ডেন্টেশন মানে আপনাকে বন্ধনী গণনা করতে হবে না। বন্ধনীগুলি কম্পিউটারের জন্য (উত্স কোডটি ব্যাখ্যা করার জন্য এবং এটিতে প্রবেশ করার জন্য)। ইন্ডেন্টেশন আপনার সহজ বোঝার জন্য।

উচ্চতর ক্রিয়াকলাপ বনাম forএবং doseqফর্মগুলি

স্কিমের পটভূমি থেকে আগত আমি mapল্যাম্বদা ফাংশন ইত্যাদি বুঝতে পেরে বরং গর্বিত হয়েছি তাই প্রায়শই আমি এই জাতীয় কিছু লিখতাম

(map (fn [[k x]] (+ x (k data))) {:a 10 :b 20 :c 30})

এটি পড়া বেশ কঠিন hard forফর্ম পথ সুন্দর হল:

(for [[k x] {:a 10 :b 20 :c30}]
  (+ x (k data)))

`মানচিত্রে প্রচুর ব্যবহার রয়েছে এবং আপনি যদি নামযুক্ত ফাংশনগুলি ব্যবহার করে থাকেন তবে সত্যিই দুর্দান্ত। অর্থাত

(map inc [12 30 10]

(map count [[10 20 23] [1 2 3 4 5] (range 5)])

থ্রেডিং ম্যাক্রোগুলি ব্যবহার করুন

থ্রেডিং ম্যাক্রোগুলি ব্যবহার করুন ->এবং ->>পাশাপাশি dotoপ্রযোজ্য ক্ষেত্রে।

মুল বক্তব্যটি হ'ল থ্রেডিং ম্যাক্রোগুলি উত্স কোডটি ফাংশন রচনাগুলির চেয়ে বেশি লিনিয়ার প্রদর্শিত হয়। থ্রেডিং ম্যাক্রো ব্যতীত নিম্নলিখিত কোডের টুকরোটি বেশ অপঠনযোগ্য:

   (f (g (h 3) 10) [10 3 2 3])

তুলনা করা

   (-> 
     (h 3)
     (g 10)
     (f [10 3 2 3]))

থ্রেডিং ম্যাক্রো ব্যবহার করে, কেউ সাধারণত একবারে ব্যবহৃত অস্থায়ী ভেরিয়েবলগুলি প্রবর্তন এড়াতে পারে।

অন্য জিনিস

  • ডকাস্ট্রিং ব্যবহার করুন
  • ফাংশন সংক্ষিপ্ত রাখুন
  • অন্যান্য ক্লোজার কোড পড়ুন

ডি-স্ট্রাকচারিংয়ের সাথে ফাংশনটি ইন্ডেন্টেশনের সাথে সুন্দর দেখাচ্ছে!
আমোগ তালপল্লিকার

ফাংশনগুলি সংক্ষিপ্ত রাখার জন্য +1। প্রচুর ছোট্ট ফাংশনগুলি অনেক বেশি স্ব ডকুমেন্টিং
ড্যানিয়েল গ্র্যাটজার

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

@ নাথানওয়ালেস একভাবে আমি আপনার সাথে একমত, তবে কিছু দিক থেকে আমি তা মানি না। দীর্ঘ নামগুলি কখনও কখনও ফাংশনগুলিকে অতিমাত্রায় তৈরি করে। সুতরাং আপনি দেখতে পাচ্ছেন যে কিছু সাধারণ ফিল্টার অপারেশন আসলে সাধারণ, যখন যুক্তির applesপরিবর্তে তখন xsআপনি ভেবেছিলেন এটি আপেলের জন্য নির্দিষ্ট। তারপরে, এছাড়াও আমি ফাংশন আর্গুমেন্টের নামগুলি লুপ ভেরিয়েবলের জন্য একটি বলার চেয়ে আরও বেশি পৌঁছানোর জন্য বিবেচনা করব। সুতরাং যদি প্রয়োজন হয় তবে আপনি সেগুলি আরও দীর্ঘ করতে পারেন। একটি শেষ চিন্তা হিসাবে: আমি আপনাকে "নাম কোডের মূল্য দেয় না" দিয়ে ছেড়ে দেব
কনটেটেটিভ.আর

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