রুবিতে ব্যক্তিগত পদ্ধতি কোথায় রাখবেন?


95

বেশিরভাগ ব্লগ বা টিউটোরিয়াল বা বইগুলির যে কোনও শ্রেণি / মডিউলের নীচে ব্যক্তিগত পদ্ধতি রয়েছে। এটি কি সেরা অনুশীলন?

আমি যখন প্রয়োজন তখন ব্যক্তিগত পদ্ধতিগুলি আরও সুবিধাজনক বলে মনে করি। উদাহরণ স্বরূপ:

public
def my_method
  # do something
  minion_method
end

private
def minion_method
  # do something
end

public
def next_method
end

এইভাবে আমি ক্রমাগত উপর থেকে নীচে স্ক্রোল করার পরিবর্তে কোডটিকে আরও পঠনযোগ্য মনে করি যা খুব বিরক্তিকর।

এই পদ্ধতির মধ্যে ভয়ঙ্কর কিছু আছে? নীচে ব্যক্তিগত পদ্ধতি থাকা কি কেবল একটি সেরা অনুশীলন এবং অন্য কিছু নয়?


আসলে আপনার উপায় খারাপ হয় না। আমি কয়েকটি ক্ষেত্রেও এটি অনুসরণ করি, এটি আরও সুবিধাজনক বলে মনে হচ্ছেprivate def my_method...end
r3bo0t

উত্তর:


131

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

শেষে, আপনি কেবল যোগ করে যে কোনও পদ্ধতি ব্যক্তিগত করতে পারেন: private :xmethod

উদাহরণ:

class Example
 def xmethod
 end

 def ymethod
 end

 def zmethod 
 end

 private :xmethod, :zmethod

end

এটি কি আপনার প্রশ্নের ন্যায্যতা দেয়?


19
ক্লাসটি দীর্ঘ ও দীর্ঘায়িত হওয়ায় পাঠযোগ্যতার দৃষ্টিকোণ থেকে এটি একটি দুর্দান্ত ধারণা বলে আমি মনে করি না।
আলেকজান্ডার সুর্যাপেল

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

58

privateরুবি ২.১ থেকে পদ্ধতির সংজ্ঞায় প্রিপেন্ড করার বিকল্প রয়েছে ।

class Example

 def xmethod
 end

 private def ymethod
 end

 private def zmethod 
 end

end

সংজ্ঞাটির দিকে তাকালে আপনি তাত্ক্ষণিকভাবে জানতে পারবেন যে কোনও পদ্ধতি ব্যক্তিগত কিনা তা ফাইলের যেখানেই এটি সংজ্ঞায়িত করা হয় না। এটি কিছুটা বেশি টাইপিং (যদি আপনি স্বতঃসিদ্ধ না করেন) এবং আপনার সমস্ত defগুলি সুন্দরভাবে বিন্যস্ত হবে না।


4
আপনার নোট যোগ করা উচিত ছিল, এটি রুবি ২.১ এ পাওয়া যায় যেখানে পদ্ধতিগুলি তাদের নিজস্ব নামের সাথে কীটি ফেরত দেয়: বাগস.রবি -আলং.আর.ইউএসইউ
কনোল

আমি বিশ্বাস করি বেসরকারীটিকেও ব্লক হিসাবে ব্যবহার করা যেতে পারে, ওরফে ব্যক্তিগতভাবে কিছু ব্যক্তিগত পদ্ধতি বন্ধ করে দেওয়া হয় ... শেষ
এডএক্স

ক্লাস পদ্ধতিগুলি সহ এটি করার বিষয়ে একটি নোটের জন্য এখানে @ দেবপুপির উত্তর দেখুন ।
মনরোয়ে

এর privateআগে কেবল একবার যুক্ত ymethodকরাও কাজ করে। এটি একাধিকবার যুক্ত করার দরকার নেই।
আইলিয়ান ওনোফ্রেই

@IulianOnofrei আপনি নীচের অন্য পদ্ধতি ছিল zmethodছাড়া private, এই পদ্ধতি বেসরকারী হবে না। সুতরাং, আপনাকে এটি পুনরাবৃত্তি করতে হবে (কমপক্ষে রুবি ২.৩ সহ)।
tsauerwein

52

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

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

    def some_private_method
    end

    def another_private method
    end

end

এই পদ্ধতিটি আপনাকে নীচে এবং উপরে স্ক্রোল করা থেকে বিরত রাখা উচিত এবং আপনার প্রোগ্রামে অন্যান্য প্রোগ্রামারদের আরও আরামদায়ক করে তুলবে।


4
আমি যখন এই মন্তব্যটি '12-এ রেখেছিলাম তখন এই সমস্ত ক্রোধ হয়েছিল। আমি এটি খুব বেশিবার আর দেখতে পাই না এবং এটি অনুকূল হয়ে পড়েছে।
নোহ ক্লার্ক

প্রাইভেটগুলি begin..endঠিক ঠিক পরে ভিতরে ফর্ম্যাট করা যায় private। তারপরে ইন্ডেন্টেশনটি সম্পাদক দ্বারা স্বয়ংক্রিয়ভাবে সেট হয়ে যায় যেহেতু কোডটির অভ্যন্তরীণ কোডটি begin(উপরের উদাহরণে) শব্দগুচ্ছভাবে 4 স্পেস দিয়ে ইন্টেন্ট করা থাকে।
পেট্রুস রেপো

আমি একই পদ্ধতির অনুসরণ করি ... প্রথমে publicএবং তারপরেprivate
রাহুল গোয়েল

4
আমি এর আগে কখনও দেখিনি এবং ২০০ 2007 সাল থেকে আমি রুবির সাথে কাজ করছি I আমি সাধারণত এটির সুপারিশ করব না।
মার্নেন লাইবো-কোসার

15

আমি মনে করি যে পাবলিক পদ্ধতিগুলি বস্তুর একধরণের ইন্টারফেস, এবং এগুলিকে সর্বাধিক বিশিষ্ট স্থানে অর্থাৎ ফাইলের শীর্ষে স্থাপন করা যৌক্তিক।


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

14

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

class FooBar

  def some_public_method
  end

  def another_public_method
  end

private

  def some_private_method
  end

  def another_private method
  end

end

আমার প্রশ্নটি আবার পড়ুন। এটি আরও সুনির্দিষ্ট হওয়ার জন্য সম্পাদনা করেছেন
ZX12R

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

কোনও পদ্ধতিকে "জনসাধারণ" হিসাবে ঘোষণার অর্থ আসলে / কী?
জেডএক্স 12 আর

6

আমি জাভা ব্যাকগ্রাউন্ড থেকে এসেছি এবং পদ্ধতির ধরণটি দেখতে স্ক্রোল করতে আমি ঘৃণা করি। আমি মনে করি এটি উন্মাদ যে কদর্যতা ছাড়াই কোনও পদ্ধতি অনুসারে পদ্ধতিটির দৃশ্যমানতা নির্দিষ্ট করতে পারে না। সুতরাং আমি #privateপ্রতিটি স্তন্যপ পদ্ধতিটির আগে একটি মন্তব্য করা এবং তারপরে ঘোষণা করে শেষ করেছিলাম private :...


4
private def method...
অ্যাকোস্টাডিনভ

5

আমি প্রতিটি পদ্ধতির জন্য সরকারী বা ব্যক্তিগত নির্দিষ্ট করা পছন্দ করি না। সমস্ত ব্যক্তিগত পদ্ধতি নীচে রেখে দেওয়া আমাকে ফাইল প্রতি "ব্যক্তিগত" একক দৃষ্টান্ত দিতে দেয়। আমার ধারণা এটি স্বাদের বিষয়।


5

একটি স্টাইল হ'ল এক সাথে পদ্ধতিগুলি গ্রুপ করা যাতে আপনি কেবলমাত্র প্রতি ক্লাসে একবার privateএবং আরও protectedএকবার ব্যবহার করেন। অন্য একটি স্টাইল পদ্ধতি সংজ্ঞা ঠিক পরে দৃশ্যমানতা নির্দিষ্ট করা হয়:

class Example
  def my_private_method
  end
  private :my_private_method

  def my_public_method
  end
end

রুবি ২.১.০ defঅনুসারে পদ্ধতির নামটি প্রতীক হিসাবে প্রত্যাবর্তন করে, তাই আরও একটি প্রবাহিত শৈলী সম্ভব:

class Example
  private def my_private_method
  end

  def my_public_method
  end

  protected def my_protected_method
  end

  private_class_method def self.my_private_class_method
  end
end

(নোট করুন যে আমরা private_class_methodশ্রেণিবদ্ধ পদ্ধতিগুলির জন্য ব্যবহার করি - অন্যথায় আমরা তখন NameError: undefined methodথেকে পেয়ে যাবprivate একটি উদাহরণ পদ্ধতি প্রত্যাশা করি। মূল উদাহরণ হিসাবে ম্যাক্রো হিসাবে ব্যবহার করার সময় এটি কেবল উদাহরণ পদ্ধতির দৃশ্যমানতার উপর প্রভাব ফেলে))

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

ক্লাস পদ্ধতি সিনট্যাক্স হিসাবে, আপনি এটি পরিবর্তে এইভাবে পরিচালনা করতে পারেন:

class Example
  private def my_private_method
  end

  class << self
    private def my_private_class_method
    end
  end
end

এটির private_class_methodআগেই আমি কলটির উল্লেখ দেখেছি এবং class << selfব্লকটি ব্যবহারের প্রয়োজন এড়াতে এটি ব্যবহারের শেষ অংশটি একটি ভাল টিপ। এখন অবধি আমি জানতাম না যে "নর্নাল" শ্রেণির পদ্ধতিগুলি ( def self.foo; endপরিবর্তে এর সাথে ঘোষিত স্পেসিফায়ার class << self; def foo; endদ্বারা প্রভাবিত হবে নাprivate
মানরো

3

ডেনিসের সঠিক উত্তর ছিল, অর্থাত্ রুবি> = ২.১ ব্যবহার করার সময়, কেবল ব্যক্তিগত (বা সুরক্ষিত, পাবলিক) দিয়ে ডিফের উপসর্গ করুন

তবে আমি বিশ্বাস করি যে এখন ব্লকের মতো ব্যক্তিগত হিসাবে ব্যবহার করাও সম্ভব:

private begin
   def foo
   end
   def bar
   end
end

def zip
end

0

আমি সাধারণত আমার পদ্ধতিগুলি নিম্নরূপে অর্ডার করি:

  1. নির্মাতা
  2. বর্ণের ক্রমে অন্যান্য পাবলিক পদ্ধতি
  3. private, শুধুমাত্র একবারে লেখা
  4. বর্ণানুক্রমিক ক্রমে ব্যক্তিগত পদ্ধতি

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


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