সবসময় বৈশিষ্ট্য এবং পদ্ধতি পরীক্ষা না করে আপনি কীভাবে জাভাস্ক্রিপ্টে হাঁসের টাইপিং ব্যবহার করবেন?


11

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

if(myObj.hasSomeProperty())

অথবা

if(myObj.hasSomeMethod())

অথবা

if(isNumber(myParam))

প্রভৃতি

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

আমি ভাবছি যে আমি স্ট্যাটিকালি টাইপ করা ভাষাগুলিতে কার্যকর কৌশলগুলি প্রয়োগ করার চেষ্টা করছি এবং জাভাস্ক্রিপ্টে এটি করার আরও ভাল উপায় আছে কি?

আমি জানি আমি কেবল পরীক্ষা করতে পারি না, তবে জাভাস্ক্রিপ্ট রান টাইম ত্রুটিগুলি ট্র্যাক করা দুঃস্বপ্ন হতে পারে যেহেতু কোডটিতে ত্রুটি আসলেই ঘটে থাকে সেখানে তারা সর্বদা ঘটে না।


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

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

টাইপ স্ক্রিপ্টে স্যুইচ করুন। এটি এখনও হাঁসের টাইপযুক্ত, তবে সংকলন সময়ে অনেক ত্রুটি সনাক্ত করতে স্ট্যাটিক টাইপিং সমর্থন করে।
কোডসইনচওস

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

@ রোসপ্যাটারসন ওপিএস সমস্যাটি ডাইনামিক টাইপিংয়ের সাথে, হাঁসের টাইপের সাথে নয়। টাইপস্ক্রিপ্ট এবং গো উভয় হাঁস টাইপ করা হয়, তবুও ওপির সমস্যাটি এড়িয়ে চলে। হাঁসের টাইপিংয়ের সমস্যাটি একটি আলাদা সমস্যা, যথা আপনার এমন সদস্য থাকতে পারে যা হাঁসের পরীক্ষায় উত্তীর্ণ হয় তবে আপনি যে চুক্তিটি প্রত্যাশা করেন তা পূরণ করেন না।
কোডসইনচাওস

উত্তর:


11

সবসময় বৈশিষ্ট্য এবং পদ্ধতি পরীক্ষা না করে আপনি কীভাবে জাভাস্ক্রিপ্টে হাঁসের টাইপিং ব্যবহার করবেন?

সহজ: সর্বদা বৈশিষ্ট্য এবং পদ্ধতি পরীক্ষা করবেন না।

রুবিতে, আপনি যা কল করছেন তাকে "চিকেন টাইপিং" বলা হয়। একটি গতিশীল হাঁস-টাইপযুক্ত, ভাষায়, আপনি কেবল বিশ্বাস করেন যে কলার আপনাকে একটি উপযুক্ত জিনিস দেয় passes চুক্তির পক্ষে তাঁর পক্ষকে সম্মান জানানো এই কলারের কাজ।

আমি জানি জাভাস্ক্রিপ্টটি হাঁসের টাইপিং ব্যবহার করে এবং প্রথমে আমি ভেবেছিলাম যে এটি সি # এর মতো দৃ strongly়ভাবে টাইপ করা ভাষার তুলনায় বহুবর্ষকে সহজ করে তুলবে।

আপনি এখানে টাইপ করার একাধিক অরথোগোনাল অক্ষকে বিভ্রান্ত করছেন। টাইপিংয়ের চারটি অर्थোগোনাল অক্ষ রয়েছে:

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

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

আমি জানি আমি কেবল পরীক্ষা করতে পারি না, তবে জাভাস্ক্রিপ্ট রান টাইম ত্রুটিগুলি ট্র্যাক করা দুঃস্বপ্ন হতে পারে যেহেতু কোডটিতে ত্রুটি আসলেই ঘটে থাকে সেখানে তারা সর্বদা ঘটে না।

ডিবাগিং শেখা সহজ কৌশল নয়। তবে, ডিবাগিং সহজ করার জন্য কৌশল রয়েছে, উদাহরণস্বরূপ সাফ স্কুইজ কেন্ট বেক দ্বারা বর্ণিত একটি কৌশল যা ডিবাগিংয়ের জন্য পরীক্ষাগুলি এবং রিফ্যাক্টরিং ব্যবহার করে:

হিট 'এম হাই, হিট' ইম লো :

রিগ্রেশন টেস্টিং এবং সাফ স্কুইজ

কেন্ট বেক, তিনটি নদী ইনস্টিটিউট

বিমূর্ততা: কার্যকরভাবে একটি ত্রুটি বিচ্ছিন্ন করতে, সিস্টেম-স্তরের পরীক্ষা দিয়ে শুরু করুন এবং ক্রমবর্ধমানভাবে ইনলাইন এবং ছাঁটাই করুন যতক্ষণ না আপনার ত্রুটিটি দেখানো সম্ভব সবচেয়ে ছোট পরীক্ষা হয়।


এই হিট ইম হাই হিট ইম লো লিঙ্কটি আমার জন্য একটি 500 পোষ্ট পেয়েছে, যেখানে মানবিক বার্তা হিসাবে "পৃষ্ঠা আর উপলব্ধ নেই"।
জোশপ

থেরাইভারসাইনটিউট.অর্গ.ডোমেনটি পরিত্যক্ত বলে মনে হয়।
বার্ট ভ্যান ইঞ্জিন শেেনা

আহ, অভিশাপ। এবং এটি এমনকি ওয়েব্যাক মেশিনে সংরক্ষণাগারভুক্ত নয় ।
Jörg W Mittag

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

@ লেজিওন: ডকুমেন্টেশন, ভাল নামকরণ, সাধারণ জ্ঞান, আচরণগত বৈশিষ্ট্য হিসাবে পরীক্ষা করা, উত্স কোড পড়া, আপনি এটির নাম দিন। নোট করুন যে এটি আসলে দুর্বল প্রকারের সিস্টেম যেমন সি # এর বা জাভা এর থেকে খুব বেশি আলাদা নয়: উদাহরণস্বরূপ, এর ফেরতের মূল্যের অর্থটি IComparer<T>.Compare(T, T)কেবলমাত্র নথি থেকে পরিষ্কার, প্রকারের থেকে নয়। এবং কোথায় এর প্রকারভেদে java.util.Collections.binarySearch(java.util.List<T>)তা বলে যে…
Jörg W Mittag

1

আমি জানি আমি কেবল পরীক্ষা করতে পারি না, তবে জাভাস্ক্রিপ্ট রান টাইম ত্রুটিগুলি ট্র্যাক করা দুঃস্বপ্ন হতে পারে যেহেতু কোডটিতে ত্রুটি আসলেই ঘটে থাকে সেখানে তারা সর্বদা ঘটে না।

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

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

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

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

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


0

আমি মনে করি আপনি সঠিক কাজ করছেন, আপনার কেবল এমন স্টাইলটি খুঁজে বের করা উচিত যা আপনার চোখে আরও খুশী করবে। এখানে কিছু ধারনা:

  • পরিবর্তে if(myObj.hasSomeProperty())আপনি ব্যবহার করতে পারে if( myobj.prop !== undefined )। এটি, আপনাকে ব্যবহার করতে হবে কঠোর মোডে, বিটিডাব্লু শুধুমাত্র অ-কঠোর মোডে কাজ করবে if( typeof myobj.prop !== 'undefined' )

  • আপনি বৈধকারকদের আলাদা করতে কিছু টাইপ চেকিং অফলোড করতে পারেন। এই বৈধতা এড়িয়ে যেতে সক্ষম হচ্ছে একবার ইন্টারফেসগুলি পরিপক্ক হয়, যেমন সুবিধা রয়েছে if( is_valid( myobject )), যেখানে is_validদিয়ে শুরু হয় if( !DEBUG ) return true;

  • কখনও কখনও এটি একটি আধ্যাত্মিক ফর্ম মধ্যে ইনপুট ক্লোন করার অর্থবোধ করে, এক্ষেত্রে আপনি ক্লোনিং ফাংশন / অবজেক্টের বিভিন্ন বৈধতা লক্ষ্যমাত্রা সংগ্রহ করতে পারেন। Exmaple জন্য, মধ্যে কন্সট্রাকটর সুবিধামত একটি কেন্দ্রীয় জায়গায় সব বিভিন্ন যাচাই চালানো হবে।my_data = Data( myobj, otherstuff )Data

  • আপনি এমন কিছু লাইব্রেরি ব্যবহার করতে পারেন যা আপনার ধরণের বৈধতাটিকে আরও মার্জিত কিছুতে প্রবাহিত করবে। এমনকি আপনি দীর্ঘমেয়াদে এই রুটটি না নিলেও আপনার নিজের স্টাইলে সহজেই সাজাতে আপনি স্বাচ্ছন্দ্যবোধ করতে পারেন। কয়েকটি উদাহরণের মধ্যে রয়েছে xtype.js , টাইপ-চেক , ভ্যালিডেটর.জেএস ইত্যাদি include

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