ম্যাথ.স্কয়ার্ট () স্ট্যাটিক ফাংশন কেন?


31

স্ট্যাটিক এবং উদাহরণ পদ্ধতিগুলি সম্পর্কে আলোচনায় আমি সর্বদা মনে করি, এটি Sqrt()স্ট্যাটিক পদ্ধতির পরিবর্তে সংখ্যা ধরণের একটি উদাহরণ পদ্ধতি হওয়া উচিত। কেন এমন? এটি অবশ্যই একটি মান নিয়ে কাজ করে।

 // looks wrong to me
 var y = Math.Sqrt(x);
 // looks better to me
 var y = x.Sqrt();

মান ধরণের ধরণের স্পষ্টতই উদাহরণ পদ্ধতি থাকতে পারে, যেমন অনেক ভাষায়, একটি উদাহরণ পদ্ধতি রয়েছে ToString()

মন্তব্যগুলি থেকে কিছু প্রশ্নের উত্তর দিতে: কেন 1.Sqrt()আইনী হওয়া উচিত নয়? 1.ToString()হয়।

কিছু ভাষায় মান ধরণের পদ্ধতি থাকতে দেয় না তবে কিছু ভাষায় তা পারে। আমি জাভা, ইসিএমএসক্রিপ্ট, সি # এবং পাইথন ( __str__(self)সংজ্ঞায়িত) সহ এগুলি সম্পর্কে বলছি । একই মত অন্যান্য ফাংশন প্রযোজ্য ceil(), floor()ইত্যাদি


18
আপনি কোন ভাষায় এটি প্রস্তাব করছেন? চান 1.sqrt()বৈধ হতে?

20
অনেক ভাষায় (যেমন জাভা) ডাবলগুলি প্রাইমেটিভ (পারফরম্যান্সের কারণে) তাই তাদের কোনও পদ্ধতি নেই
রিচার্ড টিংল

45
সুতরাং সংখ্যার প্রকারগুলি তাদের গায়ে লাগানো প্রতিটি গাণিতিক ফাংশন দিয়ে ফুলে উঠা উচিত?
ডি স্ট্যানলি

19
আমি মনে করি এফডব্লিউআইডাব্লু এর চেয়ে অনেক বেশি প্রাকৃতিক Sqrt(x)দেখায় যদি এর অর্থ কিছু ভাষায় ক্লাসের সাথে ফাংশনটি প্রিডিং করা হয় আমি তার সাথে ঠিক আছি। যদি ছিল একটি দৃষ্টান্ত পদ্ধতি তারপর ইঙ্গিত এটি এর আরো উপযুক্ত হবে ফিরে একটি মান বদলে পরিবর্তন উদাহরণস্বরূপ। x.Sqrt()x.GetSqrt()
ডি স্ট্যানলি

23
এই প্রশ্নটি তার বর্তমান আকারে ভাষা অজ্ঞাব্য হতে পারে না। এটাই সমস্যার মূল
রাইজিং ডার্কনেস

উত্তর:


20

এটি সম্পূর্ণরূপে ভাষা ডিজাইনের একটি পছন্দ। এটি আদিম ধরণের অন্তর্নিহিত বাস্তবায়ন এবং এর কারণে পারফরম্যান্স বিবেচনার উপরও নির্ভর করে।

.NET এর একটি মাত্র স্থিতিশীল Math.Sqrtপদ্ধতি রয়েছে যা একটিতে কাজ করে doubleএবং এটিকে রিটার্ন দেয়double । আপনি এতে অন্য যে কোনও কিছু পাস করুন অবশ্যই কাস্ট করা বা প্রচার করতে হবে double

double sqrt2 = Math.Sqrt(2d);

অন্যদিকে, আপনার কাছে মরিচা রয়েছে যা এই ক্রিয়াকলাপগুলি ধরণের ফাংশন হিসাবে প্রকাশ করে :

let sqrt2 = 2.0f32.sqrt();
let higher = 2.0f32.max(3.0f32);

তবে মরিচা সর্বজনীন ফাংশন কল সিনট্যাক্সও রয়েছে (এটি আগে কেউ উল্লেখ করেছেন), তাই আপনি যা খুশি তা চয়ন করতে পারেন।

let sqrt2 = f32::sqrt(2.0f32);
let higher = f32::max(2.0f32, 3.0f32);

1
এটি লক্ষণীয় যে নেট। এ আপনি এক্সটেনশন পদ্ধতি লিখতে পারেন, তাই যদি আপনি সত্যিই এই বাস্তবায়নটি দেখতে দেখতে চান তবে x.Sqrt()এটি করা যেতে পারে। public static class DoubleExtensions { public static double Sqrt( this double self) { return Math.Sqrt(self); } }
জাচারি দাও


65

মনে করুন আমরা একটি নতুন ভাষা ডিজাইন করছি এবং আমরা Sqrtএকটি উদাহরণ পদ্ধতি হতে চাই । সুতরাং আমরা doubleক্লাস তাকান এবং নকশা শুরু। স্পষ্টতই এর কোনও ইনপুট নেই (উদাহরণ ব্যতীত) এবং এটি a প্রদান করে double। আমরা কোডটি লিখি এবং পরীক্ষা করি। পরিপূর্ণতা।

তবে একটি পূর্ণসংখ্যার বর্গমূল গ্রহণ করাও বৈধ, এবং আমরা সবাইকে কেবল একটি বর্গমূলের জন্য ডাবল রূপান্তর করতে বাধ্য করতে চাই না। সুতরাং আমরা সরানো intএবং নকশা শুরু। এটা কি ফিরে আসে? আমরা কোনওটি ফিরিয়ে intআনতে পারি এবং এটি কেবল নিখুঁত স্কোয়ারগুলির জন্য কাজ করতে পারি, বা ফলাফলটি কাছের দিকে গোল করে int(আপাতত সঠিক বৃত্তাকার পদ্ধতি সম্পর্কে বিতর্ক উপেক্ষা করে)। তবে কেউ যদি অ-পূর্ণসংখ্যার ফলাফল চান? আমাদের দুটি পদ্ধতি থাকা উচিত - একটি যা প্রত্যাবর্তন করে intএবং একটি যা প্রত্যাবর্তন করে double(যা নাম পরিবর্তন না করে কিছু ভাষায় সম্ভব নয়)। সুতরাং আমরা স্থির করি যে এটির ফিরে আসা উচিত double। এখন আমরা বাস্তবায়ন করি। তবে বাস্তবায়নটি আমরা যার জন্য ব্যবহার করেছি তার মতোdouble। আমরা কি কপি-পেস্ট করব? আমরা কি উদাহরণটিতে কাস্ট করি doubleএবং সেই ইনস্ট্যান্স পদ্ধতিটি কল করি ? উভয় শ্রেণি থেকে অ্যাক্সেস করা যায় এমন একটি পাঠাগার পদ্ধতিতে যুক্তিটি কেন রাখবেন না। আমরা গ্রন্থাগার Mathএবং ফাংশন কল করব Math.Sqrt

Math.Sqrtএকটি স্থির ফাংশন কেন ?:

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

আমরা অন্যান্য যুক্তিগুলিকেও সম্বোধন করি নি:

  • উদাহরণটি পরিবর্তনের পরিবর্তে GetSqrtএটি কোনও নতুন মান ফেরত দেওয়ার পরে এটির নামকরণ করা উচিত?
  • কি হবে Square? Abs? Trunc? Log10? Ln? Power? Factorial? Sin? Cos? ArcTan?

6
1.sqrt()বনাম 1.1.sqrt()(গাদগুলি, যে দেখতে কুৎসিত দেখাচ্ছে) এর আনন্দগুলি উল্লেখ না করে কি তাদের একটি সাধারণ বেস শ্রেণি আছে? এর sqrt()পদ্ধতির জন্য চুক্তি কী ?

5
@ মিশেলটি চমৎকার উদাহরণ। কি 1.1.Sqrtপ্রতিনিধিত্ব করে তা বুঝতে চারটি পড়তে লাগল । চালাক।
ডি স্ট্যানলি

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

14
-1 এই উত্তর কিম্ভুতকিমাকার, কি নেই কোনো এই স্ট্যাটিক হচ্ছে যা করতে হবে? আপনি সেই একই প্রশ্নের উত্তর যেভাবেই নিতে যাচ্ছেন (এবং "[একটি স্থির ফাংশন সহ] বাস্তবায়ন একই" মিথ্যা, বা উদাহরণ পদ্ধতিগুলির তুলনায় কমপক্ষে এর চেয়ে সত্য আর কোনও সত্য নয়)
নীলরাজ - ড্যানি প্লেফুঘুফুট

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

25

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

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

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


প্রযুক্তিগত বিবেচনার বাইরে চলে যাওয়ার সাথে সাথে আমরা বিবেচনা করতে পারি যে এই জাতীয় পদ্ধতি ভিত্তিক গণিত ইন্টারফেসটি একটি ভাল ইন্টারফেস হবে কিনা be দুটি বিষয় উত্থাপিত হয়:

  • গাণিতিক স্বরলিপি পদ্ধতিতে নয় অপারেটর এবং ফাংশনের উপর ভিত্তি করে। যেমন একটি অভিব্যক্তি 42.sqrtঅনেক ব্যবহারকারীদের তুলনায় অনেক বেশি এলিয়েন প্রদর্শিত হবে sqrt(42)। গণিত-ভারী ব্যবহারকারী হিসাবে আমি ডট-মেথড-কল সিনট্যাক্সের চেয়ে নিজের অপারেটর তৈরি করার দক্ষতাটি পছন্দ করব।
  • একক দায়িত্বের নীতি আমাদের প্রয়োজনীয় ক্রিয়াকলাপগুলির মধ্যে এক ধরণের অপারেশনগুলির সংখ্যা সীমিত করতে উত্সাহিত করে। গুণনের সাথে তুলনা করে আপনার স্কোয়ার রুটটি খুব কমই প্রয়োজন। আপনার ভাষা বিশেষভাবে পরিসংখ্যানগত anlysis জন্য দেয়ার উদ্দেশ্যে করা, তারপর আরো প্রিমিটিভের প্রদানের তাহলে (যেমন অপারেশন যেমন mean, median, variance, std, normalizeসাংখ্যিক তালিকা, বা সংখ্যার জন্য গামা ফাংশন দিকে) উপযোগী হতে পারে। একটি সাধারণ-উদ্দেশ্যমূলক ভাষার জন্য, এটি কেবল ইন্টারফেসটি ওজন করে। একটি অপরিহার্য অপারেশনকে একটি পৃথক নেমস্পেসে ছেড়ে দেওয়া বেশিরভাগ ব্যবহারকারীর জন্য টাইপটিকে আরও অ্যাক্সেসযোগ্য করে তোলে।

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

7
@ ব্যবহারকারী 2357112: কথাটি হ'ল, নুমপি নিজেই সি এবং সিথনের মিশ্রণে কিছু পাইথন আঠালো দিয়ে রচিত। অন্যথায় এটি কখনই তত দ্রুত হতে পারে না।
কেভিন

1
আমি মনে করি যে এই উত্তরটি ডিজাইনের কয়েক বছর ধরে পৌঁছেছে এমন এক ধরণের বাস্তব-বিশ্বের সমঝোতার সাথে বেশ ঘনিষ্ঠভাবে আঘাত পেয়েছে। অন্যান্য খবর, এটা সত্যিই নেট মধ্যে ইন্দ্রিয় না পাবে করতে না "হ্যালো ওয়ার্ল্ড" .Max () LINQ এক্সটেনশন হিসেবে আমাদের অনুমতি দেয় এবং Intellisense খুব দৃশ্যমান করে তোলে। বোনাস পয়েন্ট: ফলাফল কি? বোনাস বোনাস, ইউনিকোডের ফলাফল কী ...?
অ্যান্ডিজ স্মিথ

15

আমি এই ঘটনায় অনুপ্রাণিত হব যে এখানে প্রচুর বিশেষ-গণিতের গণিতের ক্রিয়া রয়েছে, এবং আপনি যেগুলি ইউটিলিটি ক্লাসে রেখেছেন সেই সমস্ত ফাংশনগুলির সাথে সমস্ত (বা একটি এলোমেলো উপসেট) দিয়ে গণিতের ধরণের তৈরি করে তুলুন। অন্যথায়, আপনি হয় নিজের অটো-সমাপ্তির সরঞ্জামদণ্ডকে দূষিত করে তুলবেন, বা আপনি লোককে সর্বদা দুটি জায়গায় সন্ধান করতে বাধ্য করবেন। ( sinসদস্য হওয়ার পক্ষে কি যথেষ্ট গুরুত্বপূর্ণ Double, বা Mathক্লাসে বংশবৃদ্ধির মতো htanএবং exp1pকী?)

আর একটি ব্যবহারিক কারণ হ'ল এটি দেখা যাচ্ছে যে বিভিন্ন কার্যকারিতা এবং যথাযথ বাণিজ্য-অফগুলির সাথে সংখ্যাসূচক পদ্ধতিগুলি প্রয়োগ করার বিভিন্ন উপায় থাকতে পারে। জাভা আছে Math, এবং এটিও আছে StrictMath


আমি আশা করব ভাষা ডিজাইনাররা অটো-সম্পূর্ণ টুলটিপসের বিষয়ে চিন্তা করে না। পাশাপাশি, কি ঘটবে Math.<^space>? সেই স্বয়ংক্রিয়-সম্পূর্ণ সরঞ্জামটিপও দূষিত হবে। বিপরীতভাবে, আমি মনে করি আপনার দ্বিতীয় অনুচ্ছেদ সম্ভবত এখানে ভাল উত্তর এক।
কিউস

@ কিউস তারা করে। যদিও, এখানকার অন্যান্য লোকেরা এটিকে "একটি ইন্টারফেসটি স্ফীত করে দেওয়া" বলতে পারেন।
আলেকসান্দ্র ডাবিনস্কি

6

আপনি সঠিকভাবে পর্যবেক্ষণ করেছেন যে এখানে খেলতে একটি কৌতূহলী প্রতিসাম্য রয়েছে।

আমি যা বলি sqrt(n)বা n.sqrt()না করি তা সত্যই নয়, তারা উভয়ই একই জিনিস প্রকাশ করে এবং কোনটি আপনি পছন্দ করেন তা অন্য যে কোনও কিছুর চেয়ে ব্যক্তিগত রুচির বিষয়।

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

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

আমি অনুমান করি কেবলমাত্র সময়ই দু'জনের একীকরণ দীর্ঘমেয়াদে সম্ভব কিনা, তবে এটি অবশ্যই একটি আকর্ষণীয় বিবেচনা।


পাইথন ইতিমধ্যে এই দুটি সিনট্যাক্সকে সমর্থন করে। প্রতিটি অ-স্থিতিশীল পদ্ধতিটি selfতার প্রথম প্যারামিটার হিসাবে গ্রহণ করে এবং আপনি যখন পদ্ধতিটিকে শ্রেণীর সম্পত্তি হিসাবে পরিবর্তে উদাহরণের সম্পত্তি হিসাবে কল করেন, উদাহরণটি প্রথম যুক্তি হিসাবে স্পষ্টভাবে পাস হয়ে যায়। অত: পর আমি লিখতে পারেন "foo".startswith("f")অথবা str.startswith("foo", "f"), এবং আমি লিখতে পারেন my_list.append(x)অথবা list.append(my_list, x)
মার্ক আমেরিকা

@ মার্ক অ্যামেরি ভালো পয়েন্ট এটি ডি বা সি ++ প্রস্তাবগুলি যেমন করে তেমন কঠোর নয় তবে এটি সাধারণ ধারণার সাথে মানিয়ে যায়। নির্দেশ করার জন্য ধন্যবাদ!
কমিকসান্সএসএমএস

3

ডি স্ট্যানলির উত্তর ছাড়াও আপনাকে বহুকর্ম সম্পর্কে ভাবতে হবে think ম্যাথ.এসকিউআর্টের মতো পদ্ধতিগুলি সর্বদা একই ইনপুটটিতে একই মান ফেরত দেয়। স্ট্যাটিক পদ্ধতি ওভাররাইডেবল না হওয়ায় পদ্ধতিটি স্থির করা এই বিষয়টিকে পরিষ্কার করার একটি ভাল উপায়।

আপনি ToString () - পদ্ধতি উল্লেখ করেছেন। এখানে আপনি এই পদ্ধতিটিকে ওভাররাইড করতে চাইতে পারেন, সুতরাং (উপ) শ্রেণিটিকে অন্যভাবে তার প্যারেন্ট ক্লাস হিসাবে স্ট্রিং হিসাবে উপস্থাপন করা হয়। সুতরাং আপনি এটি একটি উদাহরণ পদ্ধতি।


2

ঠিক আছে, জাভাতে প্রতিটি বেসিক টাইপের জন্য একটি র‌্যাপার রয়েছে।
এবং মৌলিক প্রকারগুলি শ্রেণিবদ্ধ নয় এবং সদস্যপদ নেই।

সুতরাং, আপনার নিম্নলিখিত পছন্দ আছে:

  1. এই সমস্ত সহায়ক-ফাংশনগুলিকে প্রো-ফর্মাস-ক্লাসের মতো সংগ্রহ করুন Math
  2. এটি সম্পর্কিত র‌্যাপারে স্থির ফাংশন করুন।
  3. এটি সম্পর্কিত র‍্যাপারে সদস্য-ফাংশন করুন।
  4. জাভা বিধি পরিবর্তন করুন।

আসুন বিকল্পটি 4 রুল করুন, কারণ ... জাভা হল জাভা, এবং অনুগামীরা সেভাবেই এটি পছন্দ করে।

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

দুই নিচে, একজন এখনও হত্যা করতে পারে: অপশন 2 এটিও একটি খারাপ ধারণা, কারণ এর অর্থ হ'ল প্রতিটি ফাংশন প্রতিটি প্রকারের জন্যই প্রয়োগ করা উচিত , শূন্যস্থানগুলি পূরণ করার জন্য কেউ প্রসারিত রূপান্তর উপর নির্ভর করতে পারে না, বা অসঙ্গতিগুলি সত্যিই আঘাত করবে will
আর কটাক্ষপাত গ্রহণ java.lang.Math, আছে প্রচুর ফাঁক এর, বিশেষ করে চেয়ে ছোট ধরনের জন্য intনিজ নিজ double

সুতরাং, শেষ পর্যন্ত স্পষ্ট বিজয়ী বিকল্প এক, ইউটিলিটি-ফাংশন-শ্রেণিতে তাদের একসাথে সংগ্রহ করা।

বিকল্প 4 এ প্রত্যাবর্তন করে, সেই দিকের কিছু আসলে পরে ঘটেছে: আপনি দীর্ঘকাল ধরে নামগুলি সমাধান করার সময় আপনি যে কোনও শ্রেণির স্ট্যাটিক সদস্যদের চান তা বিবেচনা করতে সংকলককে বলতে পারেন। import static someclass.*;

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


1
Math.min()সমস্ত র‍্যাপারের প্রকারভেদে বিভিন্নতা প্রয়োগের আনন্দ বিবেচনা করুন ।

আমি # 4 স্বতঃস্ফূর্ত মনে করি। Math.sqrt()বাকি জাভা হিসাবে একই সময়ে তৈরি করা হয়েছিল, সুতরাং যখন sqrt () স্থাপনের সিদ্ধান্ত নেওয়া হয়েছিল তখন Mathজাভা ব্যবহারকারীদের historicalতিহাসিক জড়তা ছিল না যারা "এটি পছন্দ করে" " যদিও খুব একটা সমস্যা নেই sqrt()তবে ওভারলোডিং আচরণটি Math.round()নৃশংস। ধরণের মান সহ সদস্যের সিনট্যাক্স ব্যবহার করতে সক্ষম হওয়া floatএবং doubleএই সমস্যাটি এড়ানো যেত।
সুপারক্যাট

2

একটি বিষয় যা আমি স্পষ্টভাবে উল্লিখিত দেখতে পাচ্ছি না (যদিও এটিতে অ্যামোন সংকেত রয়েছে) তা হল বর্গমূলকে "উত্পন্ন" অপারেশন হিসাবে ভাবা যেতে পারে: যদি বাস্তবায়ন এটি আমাদের জন্য সরবরাহ করে না, তবে আমরা আমাদের নিজস্ব লিখতে পারি।

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

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

কিছু ভাষা ক্লাস এবং ব্যক্তিগত পদ্ধতিতে এটি প্রয়োগ করতে পারে:

class Int {
    public Int add(Int x) {
      // Do something with the bits
    }
    private List<Boolean> getBits() {
      // ...
    }
}

মডিউল সিস্টেম সহ কিছু:

signature INT = sig
  type int
  val add : int -> int -> int
end

structure Word : INT = struct
  datatype int  = (* ... *)
  fun add x y   = (* Do something with the bits *)
  fun getBits x = (* ... *)
end

লেক্সিকাল স্কোপ সহ কিছু:

(defun getAdder ()
   (let ((getBits (lambda (x) ; ...
         (add     (lambda (x y) ; Do something with the bits
     'add))

ইত্যাদি। যাইহোক, কেউ এই প্রক্রিয়া বর্গমূল বাস্তবায়নের জন্য প্রয়োজন হয়: এটি ব্যবহার বাস্তবায়ন করা যায় প্রকাশ্য একটি সাংখ্যিক ধরনের ইন্টারফেস, এবং অত: পর এটা encapsulated বাস্তবায়ন বিবরণ অ্যাক্সেস প্রয়োজন হবে না।

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


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

-2

জাভা এবং সি # টুস্ট্রিংয়ে অবজেক্টের একটি পদ্ধতি, শ্রেণি শ্রেণিবিন্যাসের মূল, সুতরাং প্রতিটি বস্তু টসস্ট্রিং পদ্ধতিটি প্রয়োগ করবে। একটি পূর্ণসংখ্যার জন্য টোস্ট্রিং এর বাস্তবায়ন এইভাবে কাজ করবে এটা ঠিক স্বাভাবিক।

সুতরাং আপনি যুক্তি ভুল। টুস্ট্রিং কার্যকর করার কারণগুলির কারণগুলি এমন নয় যে কিছু লোকের মতো ছিল: আরে চলুন মান প্রকারের জন্য একটি টসস্ট্রিং পদ্ধতি থাকা উচিত। এটি কারণ টস্ট্রস্ট্রিং ইতিমধ্যে রয়েছে এবং এটি আউটপুট করার "সর্বাধিক প্রাকৃতিক" জিনিস।


1
অবশ্যই এটি একটি সিদ্ধান্ত, অর্থাত্ objectএকটি ToString()পদ্ধতি থাকার সিদ্ধান্ত । এটি আপনার কথায় আছে "কিছু লোকের মতো ছিল: আরে চলুন মান প্রকারের জন্য একটি ToString পদ্ধতি থাকা উচিত"।
রেসিডিয়াম

-3

স্ট্রিং.সুবস্ট্রিংয়ের বিপরীতে, নাম্বার্স.কি.আরকিআরটিটি আসলে সংখ্যার একটি বৈশিষ্ট্য নয় বরং আপনার সংখ্যার ভিত্তিতে একটি নতুন ফলাফল। আমি মনে করি আপনার সংখ্যাটি স্কোয়ারিং ফাংশনে পাস করা আরও স্বজ্ঞাত।

তদতিরিক্ত, ম্যাথ অবজেক্টে অন্যান্য স্থিতিশীল সদস্য রয়েছে এবং এটি একত্রে একত্র হয়ে একত্রে ব্যবহার করার জন্য এটি আরও বোধগম্য।


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