রুবি: খারাপ অংশগুলি [বন্ধ]


20

আমি সম্প্রতি ক্রকফোর্ডের বই "জাভাস্ক্রিপ্ট: দ্য গুড পার্টস" এবং একটি অন্তর্নিহিত প্রাঙ্গনে পড়েছিলাম যে প্রোগ্রামিং ভাষাগুলিতে এমন বৈশিষ্ট্যগুলির খারাপ সেট থাকতে পারে যা প্রোগ্রামারদের এড়ানো উচিত।

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


1
আমি কখনই "শেষ" শব্দটি ব্যবহার করার ভক্ত হইনি এবং তারপরে "{" এবং "}" এর সাথে এর মিশ্রণটি আরও বিরক্তিকর হয়ে ওঠে। এটি আমাকে পাইথন-স্টাইলের সিনট্যাক্স বা সরাসরি আপ-এর প্রশংসা করে তোলে। যদিও এই বিষয়ে কেউ পিছনে পিছনে তর্ক করতে পারে এবং শেষ পর্যন্ত এর ব্যক্তিগত পছন্দকে নিয়ে অনেক কিছু করার আছে। আমি কাউকে বলতে শুনেছি যে রুবি পাইথন এবং পার্লের কদর্য অংশগুলি নিয়ে যায় এবং সেগুলি একসাথে রাখে। যদিও আমি রুবি শিখতে উপভোগ করছি।

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

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

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

2
আমার চোখ পরীক্ষা করা দরকার - আমি ভেবেছিলাম এই প্রশ্নের শিরোনাম ছিল "রুবি: দ্য ব্র্যাড পিটস"।
ওস্টারওয়াল

উত্তর:


8

আপনার পাইথন বনাম রুবি দেখতে হবে : গ্যারি বার্নহার্টের দ্বারা যুদ্ধের জন্য একটি যুদ্ধ । তিনি উদ্ধৃতিটি দিয়েছেন:

আমি রুবিকে যে জিনিসগুলি কুৎসিত মনে করি তা হ'ল এটিই আরএসপেকের মতো আশ্চর্যজনক রুবি সফ্টওয়্যারকে সম্ভব করে তোলে এবং পাইথনটি কখনই তা করতে পারেনি (বর্তমান বাস্তবায়ন দেওয়া হয়েছে)।

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

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

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


জাভাস্ক্রিপ্ট আপনাকে সেই সাথে অবজেক্টগুলিকেও আচরণ করতে দেয়।
0112

8

কিছু লোক কেবল রেলকে রবিকে বিবেচনা করে এবং এটি বিরক্তিকর কারণ ভাষাটি নিজের পক্ষে খুব ভালভাবে দাঁড়িয়ে আছে।


7

আমি মনে করি সবচেয়ে খারাপ বৈশিষ্ট্যটি open classesযা আপনাকে বিশ্বব্যাপী পরিবর্তিত শ্রেণীর বর্তমান এবং ভবিষ্যতের সমস্ত দৃষ্টান্তের আচরণ পরিবর্তন করতে দেয়।

এই বৈশিষ্ট্যটির সমস্যাযুক্ত অংশটি হ'ল, রুবি ইন্টারপ্রিটার সংজ্ঞাটি অতিক্রম করার সময় রক্ষণকালীন সময়ে এইগুলি (বিশ্বব্যাপী) পরিবর্তন ঘটে যা আপনি ইতিমধ্যে বেশ কয়েকটি অবজেক্টকে ইনস্ট্যান্ট করার পরে দীর্ঘ হতে পারে যা হঠাত্ তাদের আচরণকে বদলে দেয়।

একটি বৃহত কোড বেসে এর ফলে বাগগুলি খুঁজে পাওয়া খুব কঠিন হতে পারে - বিশেষত এটি রুবির দুর্বল দ্বারা মিশ্রিত হয়ে যায় (যেমন সিএলআর বা জেভিএমের তুলনায় উদাহরণস্বরূপ) ডিবাগিং গল্প এবং অন্যান্য বৈশিষ্ট্য (যেমন eval) এর প্রসঙ্গে এই ব্যবহারটি তৈরি করতে পারে বিশ্বব্যাপী এই পরিবর্তনটি কোথায় ঘটেছে তা খুঁজে পাওয়া বেশ কঠিন। উদাহরণস্বরূপ, যদি আপনি ইতিমধ্যে এমন জায়গায় পৌঁছে গেছেন যেখানে আপনি 'ডান' শ্রেণীর সন্দেহের কারণ হয়ে থাকেন! আমার অভিজ্ঞতায় আপনি সাধারণত একটি বুনো হংসের তাড়া দিয়ে শুরু করেন, কারণ আসল অপরাধী ব্যবহার করে কোনও বস্তুতে সমস্যাগুলি দেখা দেয়।

সুতরাং সর্বোত্তম জিনিসটি হ'ল হয় উন্মুক্ত ক্লাস ব্যবহার বন্ধ করা ( #extendএবং পরিবর্তনগুলি একটি Moduleআইএমএইচওর চেয়ে বেশি নিরাপদ, বোঝা সহজ এবং পরীক্ষা করা আরও ভাল) বা যদি এড়ানো যায় না তবে:

  • কেবলমাত্র নতুন আচরণের সাথে ক্লাসগুলি প্রসারিত করুন (যেমন বিদ্যমান আচরণকে ওভাররাইড না করে)
  • উত্স কোড ট্রিতে একটি সংজ্ঞায়িত জায়গা আছে, যেখানে উন্মুক্ত ক্লাস ব্যবহার করে সমস্ত এক্সটেনশন স্থাপন করতে হবে
  • #evalওপেন ক্লাস তৈরি করতে বন্ধু এবং ব্যবহার করবেন না
  • ওপেন ক্লাসের সমস্ত ব্যবহারকে একটি বিশাল দৃশ্যমান চার্টে রাখুন, যেখানে সমস্ত বিকাশকারীরা সেগুলি দেখতে পারে - এবং তাদের স্পষ্ট করে দিন যে তাদের মধ্যে যে কোনও পরিবর্তন হয়েছে তা পুরো কোড বেসকে (যা তারা করেন) প্রভাবিত করে 'আর্কিটেকচারাল সিদ্ধান্ত' এবং তাড়াতাড়ি হ্যাকের জন্য কার্যকর নয় not আপনার বর্তমান কাজের জন্য

5

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


এটা আমার অভিজ্ঞতা ছিল।
চক স্টেফানস্কি

2
আপনি যে অ্যাপ্লিকেশনটি তৈরি করেছিলেন যার জন্য রুবি খুব ধীর ছিল? আমি বলতে চাইছি, যখন আপনি বলছেন এটি ধীর গতিতে আমি আপনাকে বিশ্বাস করি তবে এটি কীভাবে আপনাকে আপনার লক্ষ্যে পৌঁছাতে বাধা দেয়?
ডেভিড

1
আমি মনে করি রুবি দুর্দান্ত যখন আপনি প্রোটোটাইপের মতো কিছু তৈরি করতে চান এবং এটি দ্রুত সম্পন্ন করতে চান, এমন কিছু যা বিশাল নয় এবং এটি বিশাল সংখ্যায় ক্রাঞ্চিং করবে না। আপনি যদি ক্রমাগত প্রচুর সিপিইউ চক্র চিবানো প্রত্যাশা করেন তবে যে কোনও ভাল প্রোগ্রামার সি বা সি ++ এর মতো কিছু ব্যবহার করতে জানে।
জেফ ওয়েলিং

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

1
@ জেফ: সম্মত, তবে সি এবং সি ++ লিখতে ব্যথা। রুবির মতো উচ্চ-স্তরের ভাষার বক্তব্যটি এই ব্যথাটিকে যতটা সম্ভব মোকাবেলা করা এড়ানো। এগুলি যত ধীরে ধীরে তারা তত কম লক্ষ্য অর্জন করে fulfill রুবি এমনকি উচ্চ-স্তরের গতিশীল ভাষার জন্যও ধীর। যেটি এবং নুমপি / সায়পিওয়াই যখন উচ্চ স্তরের গতিশীল ভাষার প্রয়োজন হয় তার পরিবর্তে আমি পাইথন ব্যবহার করি।
dsimcha

4

এটি যদি রেলের অন রুবেলে প্রসারিত করা যায় তবে:

  1. ডাটাবেসের যুক্তি প্রতিটি একক টেবিলকে একটি auto_incrementপ্রাথমিক কী দেয়, এমন টেবিলগুলি সহ যা তাদের প্রয়োজন হয় না এবং সেগুলি থাকা উচিত নয় The

  2. যৌগিক কীগুলি মোটেই সমর্থিত নয়।

কেবল সরল রুবির জন্য আমার গ্রিপটি যে কোনও ভাষার পক্ষে মত প্রকাশের জন্য সুরক্ষার ব্যবসায়ের মতো; এটি কেবলমাত্র একটি সামান্য কোড দিয়ে অনেক কিছু করা সহজ তবে যে কোনও পরিমাণ কোড সহ বিশাল গন্ডগোল করা ঠিক তত সহজ।


আমি প্রশ্নের ক্ষেত্র সংকীর্ণ করায় দয়া করে আমার সম্পাদনাগুলি দেখুন। সম্পাদনাগুলি সহ এই প্রশ্নটি অনুমোদিত হলে আমি রেলগুলির জন্য আরও একটি সমান্তরাল শুরু করব।

1
দুঃখিত, তবে আপনি auto_incrementভূল হয়ে গেছেন, একটি রেল অ্যাপ্লিকেশনটিতে প্রতিটি টেবিলের জন্য একটি আইডি থাকা দরকার না , উল্লেখযোগ্যভাবে has_and_belongs_to_many সম্পর্কের জন্য সারণীগুলিতে যোগদানের জন্য আইডি কলামটি স্পষ্টভাবে না দেওয়ার পরামর্শ দেওয়া হয়।
ব্রেট বেন্ডার

@ ব্রেট - এগুলি কি তুলনামূলকভাবে নতুন সংযোজন? ২০০৮ এর শুরুর দিকে আমি যখন এটির সাথে খেলছিলাম তখন অবশ্যই এটির বৈশিষ্ট্যগুলি ছিল না। যাই হোক না কেন, দুর্দান্ত যে তারা এখন উপলব্ধ।

1
@ আরোথ: আমি নিশ্চিত নই যে প্রত্যেকে "গত তিন বছরের মধ্যে" বলতে "তুলনামূলকভাবে নতুন" বিবেচনা করবে:

ডেটা ম্যাপার নামে পরিচিত রেলগুলির অ্যাক্টিভেকর্ডের একটি বিকল্প রয়েছে , যা অ্যাক্টিভেকর্ড হিসাবে মতামতযুক্ত নয়।
এন্ডি তেজহোনো

3

রুবি একটি অস্বাভাবিক স্তরে রূপক (প্রতিচ্ছবি, অন্তঃকরণ), বহু-প্যারাডিম প্রোগ্রামিং এবং গতিশীলতা আলিঙ্গন করে। নিজেকে শক্তি এবং নমনীয়তার সাথে পায়ে গুলি করা সহজ।

বিরক্তিজনক? রুবি চূড়ান্তভাবে পঠনযোগ্য বা অবিচ্ছিন্ন হওয়ার ক্ষমতা রাখে। আমি কোড দেখেছি যা দেখে মনে হচ্ছে এটি কোনও বাশ স্ক্রিপ্টের অন্তর্গত।

খারাপ অভ্যাস? কিছু রুবিবাদী জ্ঞানের চেয়ে চালাকতার মূল্য দেয়। তারা কৌশলগুলি লিখে এবং ভাগ করে দেয় যা তাদের চতুরতা প্রদর্শন করে, তবে এটি অপঠনযোগ্য এবং ভঙ্গুর কোড তৈরি করে।

অন্যদিকে: জাভাস্ক্রিপ্ট ডিজাইনের দ্বারা একটি বিপর্যয় ছিল এবং "দ্য গুড পার্টস" বইটি এর লুকানো সৌন্দর্য বের করার চেষ্টা করে। পার্ল, এমন একটি ভাষাকে জনপ্রিয় করে তুলেছে যা "এটি করার চেয়ে ওয়ান ওয়ে করারও উপায় আছে" (যা নমনীয়তা) রয়েছে, "পার্ল, সেরা অনুশীলন" এ একটি সমকালীন বই রয়েছে। পার্লের ইতিহাস এক পরীক্ষামূলক এবং কঠোর জয়ের অভিজ্ঞতা, "সেরা অনুশীলনগুলি" এর জ্ঞানের প্রতিনিধিত্ব করে। পার্ল 6 হবে, আমি মনে করি এটি ন্যায়সঙ্গত বলে মনে হয়, সেই জ্ঞানের উপর ভিত্তি করে ভাষার একটি রিবুট এবং আরও অনেক কিছু। রুবি একই রকম সমস্যায় ভুগতে পারে।

@ জেমস এবং লুপগুলির জন্য ... আপনি যখন রুবিতে লুপের জন্য কোনও কাজ করেন, তখন এটি ".চেনা" কল করে। সুতরাং, সি স্টাইল লুপগুলির সাথে আরও স্বাচ্ছন্দ্যযুক্ত লোকদের জন্য "ফর" সিনট্যাকটিক চিনি। তবে একজন রুবিবাদক হিসাবে আপনি সর্বদা .map, .inject, .each_with_object এর মতো পুনরাবৃত্তি ব্যবহার করতে চলেছেন। রুবিতে "i = 0; i> 6; i ++" এর মতো কোনও জিনিস দিয়ে আপনাকে কখনই লুপের জন্য লিখতে হবে না এবং এর ফলে আপনি অভ্যাসটি শেষ করে দেবেন। @ অ্যান্ড্রু ... সুস্পষ্ট রুবি লুপগুলির পক্ষে সমর্থন করে না।


-1

এটি ভাষার চেয়ে প্রোগ্রামারদের সম্পর্কে আরও বেশি, তবে কেন রুবি প্রোগ্রামাররা লুপের জন্য এত ঘৃণা করে?

আমি বুঝতে পারি রুবির রয়েছে:

someCollection.each do |item|
   ...
end

তবে আমি কখনও দেখিনি যে লুপের জন্য ঠিক একই জিনিসটি না করায় এমন পরিস্থিতিতে ব্যবহৃত হয়।

আমি বেশ কয়েকবার জিজ্ঞাসা করেছি এবং এটির কোনও ভাল উত্তর পাই নি।

যদি এটি কেবল একটি স্টাইলের জিনিস হয় তবে আমি তা গ্রহণ করে খুশি, তবে আমি রুবি প্রোগ্রামারদের এই বিষয়ে সত্যই কাজ করতে দেখেছি এবং আমি সত্যিই আগ্রহী।


1
একবার আমি এমনকি উত্তর পেয়েছি "এটি কম কী টিপুন", যা পরিষ্কারভাবে মিথ্যা ... :-)
জেমস

2
দুটি তত্ত্ব: 1) forলুপগুলি ব্যবহার করা n00bs এর মতো কিছু। রুবিতে সি প্রোগ্রামিং করা লোকেরা। ২) রুবিতে ব্লক প্রচুর ব্যবহৃত হয়, তাই ব্লক-জাতীয় কিছু ব্যবহার না করা কেবল অতিরিক্ত মানসিক প্রচেষ্টা।
অ্যান্ড্রু গ্রিম

3
আমি যখন রুবিকে শিখতে শুরু করেছি, ব্লকগুলি এমন কিছু যা আমি সত্যিই পছন্দ করি এবং পাইথন ব্যবহার করার চেষ্টা করার সময় মিস করি। লুপের জন্য কি একই জিনিস করা যাবে? অবশ্যই, আমার কাছে, এই ধরণের শৈলী লুপের চেয়ে আমার পছন্দগুলিকে স্যুট করে।
জেটি

2
@ অ্যান্ড্রু সত্যি কথা বলতে, আপনার প্রথম উত্তর হ'ল ঠিক সেই ধরণের জঞ্জাল আমি যখন আগে জিজ্ঞাসা করেছি তখন ফিরে এসেছি। শীর্ষে একটি সূক্ষ্ম অপমান সহ সত্যিকারের কোনও কারণ নেই। @ ওয়েইন, @ জেটি এবং @ অ্যান্ড্রুজ ২ য় উত্তর: ধন্যবাদ। যথেষ্ট যথেষ্ট তারপর।
জেমস 21

1
যদি আপনি লুপের জন্য "বর্ধিত" বলতে চান (যেমন <এক্সপ্রেশন> ইন <মূল্য> এর জন্য) ... # ব্যবহারের ক্ষেত্রে এবং এর সাধারণ ব্যবহৃত চাচাত ভাইদের কাছাকাছি উপস্থিতি ছাড়াও কোনও পার্থক্য নেই # ইনজেক্ট, # সমষ্টি, # আপনি যদি 'সি' স্টাইলের ইনডেক্সড লুপগুলির কথা বলছেন (যেমন, আমি i = 0; i <যাই; ++ i) পার্থক্যটি হ'ল, একটি) "একের পর এক" ত্রুটি অসম্ভব এবং খ) এটি আপনার লুপের অভিপ্রায়টিকে পরিষ্কার করে দেয় - # প্রতিটি অর্থের জন্য "প্রতিটি উপাদান একটি পার্শ্ব প্রতিক্রিয়া তৈরি করে" অর্থ meaning লুপের জন্য এটিকে কেবল তার উদ্দেশ্যটির 'টুকরো' পেতে পুরো লুপটি পড়তে হবে।
আলেকজান্ডার বাটিস্টি

-1

আমি সাধারণত অন্যান্য ভাষার সাথে পিছনে সামঞ্জস্যপূর্ণ হওয়ার জন্য যুক্ত করা জিনিসগুলি এড়াতে চাই। উদাহরণস্বরূপ, পেরলিসমস এবং for x in y


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