কোনও নতুন ভাষার ভাষা যদি স্ক্র্যাচ থেকে টিডিডি-তে সহজ করার জন্য ডিজাইন করা হয়েছিল তবে কীভাবে চেহারা লাগবে?


9

কয়েকটি সাধারণ ভাষার (জাভা, সি #, জাভা, ইত্যাদি) সাথে কখনও কখনও মনে হয় আপনি নিজের কোডটি পুরোপুরি টিডিডি করতে চাইলে আপনি ভাষার সাথে মতবিরোধ নিয়ে কাজ করছেন।

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

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


এমন একটি ভাষা সম্পর্কে কীভাবে টিডিডি প্রয়োজন হয় না? blog.8thlight.com/uncle-bob/2011/10/20/Simple-Hickey.html
কাজের

2
কোনও ভাষার টিডিডি দরকার নেই । টিডিডি একটি দরকারী অনুশীলন , এবং হিকির একটি বিষয় হ'ল আপনি যা পরীক্ষা করেছেন তার অর্থ এই নয় যে আপনি চিন্তাভাবনা বন্ধ করতে পারেন ।
ফ্র্যাঙ্ক শিয়েরার

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

উত্তর:


6

বহু বছর আগে আমি একটি প্রোটোটাইপ একসাথে নিক্ষেপ করেছি যা অনুরূপ প্রশ্নের সমাধান করে; এখানে একটি স্ক্রিনশট:

জিরো বাটন টেস্টিং

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


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

কিন্তু আপনি কি সেখানে পরীক্ষা ছেড়ে যেতে চান? আপনি কি তাদের উত্পাদন কোডের জন্য সক্ষম রেখে দেবেন? হতে পারে তারা সি এর জন্য # ifdef'd আউট হতে পারে, অন্যথায় আমরা কোড-আকার / রান-টাইম হিটগুলি খুঁজছি।
মাওগ বলছেন মনিকা

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

5

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

কীভাবে গতিশীল টাইপিং এইডস টেস্টিং

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

class MessageSender
  def send
    # Do something with a side effect
  end
end

ধরা যাক যে আমাদের একটি মেসেজসেন্ডার ব্যবহারকারী রয়েছে যা মেসেজসেন্ডারের উদাহরণ ব্যবহার করে:

class MessageSenderUser

  def initialize(message_sender)
    @message_sender = message_sender
  end

  def do_stuff
    ...
    @message_sender.send
    ...
    @message_sender.send
    ...
  end

end

নির্ভরতা ইনজেকশন , ইউনিট পরীক্ষার প্রধানতম এখানে ব্যবহার নোট করুন । আমরা ফিরে আসব।

আপনি MessageSenderUser#do_stuffকল করতে চান যে কল দুটি বার প্রেরণ। আপনি যেমন স্ট্যাটিকালি টাইপ করা ভাষায় চান তেমনই আপনি একটি মক ম্যাসেজসেন্ডার তৈরি করতে পারেন যা কতবার কল করা sendহয়েছিল তা গণনা করে । তবে স্ট্যাটিকালি টাইপ করা ভাষার মতো নয়, আপনার কোনও ইন্টারফেস ক্লাসের দরকার নেই। আপনি কেবল এগিয়ে যান এবং এটি তৈরি করুন:

class MockMessageSender

  attr_accessor :send_count

  def initialize
    @send_count = 0
  end

  def send
    @send_count += 1
  end

end

এবং এটি আপনার পরীক্ষায় ব্যবহার করুন:

mock_sender = MockMessageSender.new
MessageSenderUser.new(mock_sender).do_stuff
assert_equal(mock_sender.send_count, 2)

নিজেই, একটি গতিময়ভাবে টাইপিত ভাষার "হাঁসের টাইপিং" কোনও স্ট্যাটিকালি টাইপ করা ভাষার তুলনায় পরীক্ষার সাথে তেমন যোগ করে না। তবে কী যদি ক্লাসগুলি বন্ধ না করা হয় তবে রানটাইমে সংশোধন করা যায়? এটি একটি গেম চেঞ্জার। আসুন দেখুন কিভাবে।

শ্রেণি পরীক্ষার যোগ্য করতে যদি আপনার নির্ভরতা ইনজেকশন ব্যবহার না করে তবে কী হবে?

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

class MessageSenderUser

  def initialize
    @message_sender = MessageSender.new
  end

  def do_stuff
    ...
    @message_sender.send
    ...
    @message_sender.send
    ...
  end

end

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

ওপেন ক্লাস আপনাকে নির্ভরতা ইনজেকশন ছাড়াই পরীক্ষা করতে দেয়

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

mock_message_sender = mock MessageSender
MessageSender.should_receive(:new).and_return(mock_message_sender)
mock_message_sender.should_receive(:send).twice.with(no_arguments)
MessageSenderUser.new.do_stuff

এটাই পুরো পরীক্ষা। যদি ঠিক দু'বার MessageSenderUser#do_stuffপ্রার্থনা না করে তবে MessageSender#sendএই পরীক্ষাটি ব্যর্থ হয়। আসল মেসেজসেন্ডার শ্রেণি কখনই আহবান করা হয় না: আমরা পরীক্ষাটি বলেছি যে যখনই কেউ ম্যাসেজসেন্ডার তৈরি করার চেষ্টা করবেন, তাদের পরিবর্তে আমাদের মক ম্যাসেজসেন্ডারটি পাওয়া উচিত। কোন নির্ভরতা ইনজেকশন প্রয়োজন।

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

তবে এটি উন্মুক্ত ক্লাসগুলির সাথে কী করার আছে? কলটি নোট করুন MessageSender.should_receive। আমরা মেসেজসেন্ডারটি লিখতে গিয়ে # শোল্ড_আরসিভের সংজ্ঞা দিইনি, তাহলে কে করেছে? উত্তরটি হ'ল পরীক্ষার কাঠামোটি, সিস্টেম ক্লাসে কিছু সাবধানে পরিবর্তন করে, এটি প্রদর্শিত করতে সক্ষম হয় যেমন # শোল_প্রেরণ প্রতিটি বস্তুর উপর সংজ্ঞায়িত হয়। আপনি যদি ভাবেন যে এর মতো সিস্টেম ক্লাসগুলি সংশোধন করতে কিছুটা সতর্কতা প্রয়োজন, আপনি ঠিক বলেছেন। তবে এটি পরীক্ষার পাঠাগারটি এখানে কী করছে তার জন্য নিখুঁত জিনিস এবং উন্মুক্ত ক্লাসগুলি এটি সম্ভব করে তোলে।


দুর্দান্ত উত্তর! আপনি ছেলেরা আমার সাথে ডায়নামিক ভাষায় ফিরে কথা বলতে শুরু করেছেন :) আমি মনে করি এখানে হাঁসের টাইপিংই মূল বিষয়, .নু দিয়ে কৌশলটি সম্ভবত একটি স্ট্যাটিক্যালি টাইপ করা ভাষায় (যদিও এটি অনেক কম মার্জিত হবে)।
জিওফ

3

তাহলে কোনও ভাষা দেখতে কেমন লাগবে যদি এটি স্ক্র্যাচ থেকে ডিজাইনে টিডিডি দিয়ে দুর্দান্ত করা যায়?

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

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

সরঞ্জাম এবং ফ্রেমওয়ার্কের সাহায্যে টিডিডি সমর্থন করা আরও ভাল। এটি আইডিইতে তৈরি করুন। একটি উন্নয়ন প্রক্রিয়া তৈরি করুন যা এটি উত্সাহ দেয়।

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

প্রশ্নের উত্তর দেওয়ার জন্য আপনি যা বলতে পারেন তা হ'ল এই জাতীয় ভাষা পরীক্ষার পক্ষে উপযুক্ত। আমি জানি যে খুব বেশি সাহায্য করে না, তবে আমি মনে করি যে সমস্যাটি এই প্রশ্নটি নিয়ে।


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

0

ভাল, গতিময়ভাবে টাইপ করা ভাষাগুলির স্পষ্ট ইন্টারফেসের প্রয়োজন হয় না। রুবি বা পিএইচপি ইত্যাদি দেখুন

অন্যদিকে, জাভা এবং সি # বা সি ++ এর মতো স্ট্যাটিকালি টাইপ করা ভাষাগুলি প্রকারগুলি প্রয়োগ করে এবং আপনাকে সেই ইন্টারফেসগুলি লিখতে বাধ্য করে।

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

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

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


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

আমি জাভা এবং সি # তে ঠাট্টা-বিদ্রূপ করার সাথে খুব বেশি পরিচিত নই, তবে যতদূর আমি জানি, একটি উপহাস করা বস্তু আসল বস্তুর নকল করে। আমি প্রায়শই অবজেক্টের ধরণের পরামিতি ব্যবহার করে এবং পরিবর্তে পদ্ধতি / শ্রেণিতে একটি মক পাঠিয়ে নির্ভরতা ইনজেকশন করি। ফাংশন এর মত কিছু কিছু নাম (আরেকটি ক্লাস $ অবজেক্ট = নাল) $ $ this-> anotherObject = $ অবজেক্ট? : নতুন আরেকটি ক্লাস; An এটি একটি ইন্টারফেস থেকে প্রাপ্ত না করে নির্ভরতা ইনজেকশনের জন্য প্রায়শই ব্যবহৃত কৌশল।
প্যাটকোস সিএসবা

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