সিস্টেমগুলি হাঙ্গেরীয় স্বরলিপি কি এখনও একটি কার্যকর অনুশীলন? [বন্ধ]


23

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

আমি যে অভ্যন্তরীণ সিস্টেমে সিস্টেমগুলি অপ্রত্যাশিত করব তা কেন একটি ভ্যালিড কারণ আছে?

এখন পর্যন্ত আমি এটি ব্যবহারের জন্য নিম্নলিখিত সুবিধা দেখতে পাচ্ছি:

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

এবং ডাউনসাইডগুলি অনুসরণ করছেন:

  • এটি কিছু লোককে বিরক্ত করে (কেন জানি না)
  • যদি টাইপ পরিবর্তন করা হয় তবে প্রকারটি ভেরিয়েবলের নামকরণের সাথে মেলে না (

তাহলে কেন:

vector<string> vecCityNames;
wstring strCity = L"abc";
//more code here
vecCityNames.push_back(strCity);

এর চেয়ে খারাপ:

vector<string> cityNames;
wstring city = L"abc";
//more code here
cityNames.push_back(city);//Are we pushing back int on a queue? Float on a stack? Something else?

4
যদি ইন্টেলিজেন্স মারা যায় তবে আপনার কোডটি অবৈধ। যদি এটি অবৈধ হয় তবে কেন ভেরিয়েবলের নামটি সঠিক?
বুদ্বুদ্বার্প

6
@ বুবলাপ্র্যাপ: বেশিরভাগ ইন্টেলিজেন্স বাস্তবায়নগুলি মাঝে মধ্যে 3 সেকেন্ডের জন্য বৈধ কোডেও ছুটে যায়। এবং কখনও কখনও কোডগুলি সংকলন এবং লিঙ্কগুলি সত্ত্বেও এগুলি মোটেই কাজ করে না। আমরা যুক্তিসঙ্গত আকারের প্রকল্পগুলি সম্পর্কে কথা বলছি।
কোডার

9
করা উচিত নয় vectCityNamesহতে vectStringCityNamesআপনার সামঞ্জস্যপূর্ণ যুক্তি জন্য আপনাকে অনেক, এবং এই "প্রশ্ন" কিছু আর একটি গলাবাজি আরো, আপনি আপনার মন স্থির, এই বন্ধ করে দেওয়া উচিত না।

8
আপনি কোন "বৈধ" কারণ হিসাবে বিবেচনা করেন?
অ্যাডাম শিখুন

15
আপনার মন্তব্যটি যেভাবে বোঝায় তাতে আপনার দ্বিতীয় উদাহরণটি বিভ্রান্তিকর বলে মনে হয় না। এর অর্থটি cityNames.push_back(city)বেশ পরিষ্কার। এটি শহরের নামের একটি তালিকা এবং আপনি একটি যুক্ত করছেন।
ক্রিস বার্ট-ব্রাউন

উত্তর:


62

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

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

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

* আমাদের বর্তমান প্রকল্প থেকে মাত্র একটি সংক্ষিপ্ত তালিকা: আমরা আছে Charge, ChargeBreakdown, ChargeCalculator, ChargeDAO, ChargeDTO, ChargeLineHelper, ChargeMaps, ChargePairএবং ChargeTypeঅন্যান্যের মধ্যে। তদুপরি আমাদের কাছে Contracts, Countries, Checkouts, Checkins ... আছে এবং এটি কেবলমাত্র সি অক্ষর, এমন একটি প্রকল্পে যা সম্ভবত ওপি দ্বারা "যুক্তিসঙ্গত আকারের" নামেও ডাকা হত না।


দাবি অস্বীকার: আমি আসলে হাঙ্গেরিয়ান, তাই আমি বিশ্বাস করি যে আমি এই ইস্যুতে কর্তৃপক্ষের সাথে কথা বলতে পারি ;-)


"স্ট্রং টাইপিং" - সি ++ এর যদি সত্যিই শক্তিশালী টাইপ সিস্টেম থাকে তবে আপনাকে হ্যাক হিসাবে চলক নামে প্রকারের এম্বেড করতে হবে না।
মাইকেল বার্জ

19
@ মিশেলবার্গ: এটাই কথা। আপনার দরকার নেই। কারণ এটা করে।
ডেড এমএমজি

8
ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি সম্পর্কে পয়েন্টের জন্য +1। নামকরণযুক্ত iPosবা ভেরিয়েবলগুলি fAmountসহনীয় হতে পারে তবে কোনও কোডবেসে কাজ করার চেষ্টা করুন যেখানে প্রতিটি অবজেক্ট ভেরিয়েবলকে রিডানডেন্ট ছয়-বর্ণের উপসর্গ দেওয়া হয় কেবল এটি আপনাকে অবহিত করে যে এটি "কাঠামোর প্রতি নির্দেশক"।

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

1
আমি মনে করবো যে একটি প্রধান জায়গা যেখানে জাভাটিকে হাঙ্গেরিয়ান স্বরলিপি ব্যবহারের পরামর্শ দেওয়া উচিত ছিল তা হল পরিবর্তিত হতে পারে তবে কখনও ভাগ করা যায় না (যেমন char[]একটি দ্বারা অনুষ্ঠিত StringBuilder) এবং উল্লেখযোগ্য উদাহরণগুলির উল্লেখগুলির মধ্যে পার্থক্য করা যা পরিবর্তিত হতে পারে না তবে তাদের এমন কোনও জিনিসের সাথে ভাগ করা যেতে পারে যা তাদের রূপান্তরিত করে না (যেমন ধরে char[]রাখা String, যা একাধিক Stringউদাহরণের মধ্যে ভাগ করা যায় )। উভয় ক্ষেত্র একই ধরণের char[], তবে তারা এমন জিনিস রাখে যা খুব আলাদা। মিউটিবিলিটি সম্পর্কিত প্রচুর বাগগুলি ...
সুপারক্যাট

35

std::vector<string> vecCityNames;খারাপ কেন ?

হাঙ্গেরিয়ান নোটেশনের সমস্যাটি সাধারণত এটি ব্যবহৃত হয় যে, প্রোফাইলিং যদি দেখায় যে শহরের নামগুলি বরং একটিতে রাখা উচিত std::deque, সেই ধরণের কোনও অবজেক্টের উল্লেখ করে সমস্ত পরিবর্তনশীল নাম হঠাৎ করেই একটি বিভ্রান্তিকর নাম হয়ে যায়।

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

আমি যা জানি, চার্লস সিমনিই হাঙ্গেরিয়ানদের সাথে যেভাবে এসেছিলেন, সেখান থেকে উপসর্গটি সিনট্যাকটিক টাইপের পরিবর্তে ভেরিয়েবলের সিনমেটিক ব্যবহার বোঝায় । এটি হ'ল আপনার শহরের নামের তালিকার যথাযথ উপসর্গ, এটি যে ধরণের ক্ষেত্রে প্রয়োগ করা হয়েছে তা বিবেচনাধীন সম্ভবত হতে পারে listCityNames(বা lstCityNames, যদি আপনার listপক্ষে ক্রিপ্টিক যথেষ্ট না হয়)।

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


6
@ কোডার: প্রকারটি পুরো প্রকল্পে ব্যবহৃত হয় এবং এই ধরণের সমস্ত ভেরিয়েবলের উপসর্গ থাকবে। আপনাকে একটি বৈশ্বিক চলক নয়, স্থানীয় কয়েকশো নাম পরিবর্তন করতে হবে।
এসবিআই

7
আপনার জোয়েল স্পলস্কির ব্লগ পোস্টে একটি লিঙ্ক যুক্ত করা উচিত যেখানে তিনি কেন একটি পরিবর্তনশীল ধরণের ব্যবহারের জন্য হাঙ্গেরিয়ান বিজ্ঞপ্তি প্রকাশের জন্য তার ব্যাখ্যা দেওয়ার প্রস্তাব দিচ্ছেন এটি সমস্ত কিছুর একটি ভুল ধারণা। আপনার পক্ষে ভাল তবে কিছু লোক হয়তো আরও কিছু প্রামাণিক কিছু খুঁজছেন এবং আপনি এটি আপনার ক্ষেত্রে ব্যাক আপ করার জন্য ব্যবহার করতে পারেন। joelonsoftware.com/articles/Wrong.html
শেন ওয়েল্টি

2
@Coder: দুর্ভাগ্যবশত, typedefএকটি গম্ভীরভাবে তুচ্ছ বলে পরিগণিত টুল
এসবিআই

4
@ শানে: আমি বিষয়টি সম্পর্কে নিজের মতামত লিখেছি। এটি যদি জোয়েলের সাথে মানানসই হয় তবে তা আমার পক্ষে ঠিক আছে, কারণ আমি তার মতামতকে মূল্য দিয়েছি যদিও তাদের মধ্যে কিছুগুলির সাথে আমি একমত নই। যখন আমি দশ দশকেরও বেশি অভিজ্ঞতার ভিত্তিতে অভিজ্ঞতার উপর ভিত্তি করে আমার নিজের মতামতটি সমর্থন করার জন্য অন্য "কর্তৃপক্ষের" কাছে আবেদন করার প্রয়োজন দেখছি না। এটি দুর্দান্ত যে আপনি সেই লিঙ্কটি পোস্ট করেছেন, তবে অন্য ব্যক্তির মতামতগুলির সাথে তুলনা করা ভাল।
sbi

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

15

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

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


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

1
এখানে আসল যুক্তি টাইপ থিওরি সম্পর্কে উল্লেখ করার জন্য +1। হাঙ্গেরিয়ান স্বরলিপি অতিরিক্ত তথ্য সহ টাইপ সিস্টেমকে বাড়ানোর একটি কৌশল এবং যেমন নান্দনিক গুণাবলী (বা টেম্পলেট, টাইপডেফ ইত্যাদি) প্রকারের নান্দনিক গুণাবলীর উপর আলোচনা না করে (যেমন টেম্পলেটগুলি, টাইপডেফ ইত্যাদি) তুলনা করা এবং তার সাথে তুলনা করা উচিত or উহার অভাব).
ড্যানিয়েল প্রাইডেন

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

10

এটি কিছু লোককে বিরক্ত করে (কেন জানি না)

এটি আমাকে বিরক্ত করার কারণ হ'ল কোডটি আমার ভিজ্যুয়াল স্ক্যানিংকে ধীর করে দেয় এমন প্রতিটি একক শনাক্তকারীর উপর এটি একটি সামান্য গতির বাধা। sIt এর mAs bIf p আপনি kHad zTo qRead iEnglish cText l লাইক করুন এটি।


9

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

আপনি জিজ্ঞাসা করেছেন কেন কিছু লোক কেন হাঙ্গেরিয়ান স্বীকৃতিকে বিরক্তিকর মনে করে। আমি অন্যের পক্ষে কথা বলতে পারি না, তবে যে কারণে এটি আমাকে বিরক্ত করে তা হ'ল:

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

  2. এটা নিরর্থক। একটি ভেরিয়েবলের ঘোষণাটি তার প্রকারটি প্রতিষ্ঠিত করে; পরিবর্তনশীল নামে সেই তথ্যটি পুনরাবৃত্তি করার প্রয়োজন বোধ করি না। এর ফলে প্রতিটি ভাষায় সত্য নয়: পার্ল মধ্যে, উদাহরণস্বরূপ, যেমন sigils @ বা $ পরিবর্তনশীল নামের আগে লেখা, যাতে আপনি যেকোন চয়েস থাকে না কিন্তু তাদের ব্যবহার করার জন্য মূলত পরিবর্তনশীল ধরণ নির্ধারণ করুন।

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

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

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

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

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

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

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

তদনুসারে, হাঙ্গেরিয়ান স্বরলিপি ব্যবহার বন্ধ করার একটি বৈধ কারণ হ'ল:

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


"কি পার্থক্য szFooএবং pszFoo"? একটি char*, অন্যটি char**, আমাকে পার্থক্যটি বলতে 0,25 সেকেন্ড নিয়েছিল। ইন্টেলিসেন্স দিয়ে এটি বীট করার চেষ্টা করুন।
কোডার

2
@ কোডার, pnFooসম্ভবত হবেন int*, না int**তাই আপনাকে জানতে হবে এটির szঅর্থ পয়েন্টারও রয়েছে। আমি নিশ্চিত যে এটি হাঙ্গেরীয় উপসর্গ প্রতিষ্ঠিত সীমাবদ্ধ সংখ্যার জন্য কোনও বড় সমস্যা নয়, তবে বড় আকারের কোনও প্রকল্পে হাজারে সংখ্যার সংজ্ঞায়িত ধরণের সংখ্যা রয়েছে। আমি ইন্টেলিসেন্স সম্পর্কে জানি না, তবে আইডিইগুলি গত 25 বছর ধরে অবিচ্ছিন্নভাবে উন্নতি করেছে এবং আমি আশা করি যে এই ধারাটি অব্যাহত থাকবে।
কালেব

8

এখন পর্যন্ত আমি এটি ব্যবহারের জন্য নিম্নলিখিত সুবিধা দেখতে পাচ্ছি:

  • ধারাবাহিক পরিবর্তনশীল নামকরণ

আমি যদি সিম্পসন্স-এর চরিত্রগুলির পরে আমার সমস্ত ভেরিয়েবলের নাম রাখি তবে এটিও সামঞ্জস্যপূর্ণ তবে এটি কি কোনও উপকার?

  • আপনি অনুসন্ধান ছাড়াই প্রকারটি দেখুন (ইন্টেলিজেন্স মারা গেছে / অর্ধেক সময় সূচীকরণ, তাই এটি এখনও একটি বৈধ কারণ)

একটি নির্দিষ্ট সরঞ্জামের দুর্বলতার ভিত্তিতে এটিই একমাত্র বৈধ কারণ ...

  • শব্দার্থকগুলি এখনও নামের দ্বিতীয় অংশে প্যাক করা যায়

এটি কোনও লাভ নয়; আপনি কেবলমাত্র ( বৃহত্তর ) নিম্নমানের অনুপস্থিতির দাবি করছেন ।


6

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

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


4
"আইডিই তুচ্ছভাবে আমাকে বলবে যে আমি যখন এটির উপর মাউস রাখি তখন কোনও ভেরিয়েবলের ধরণ কী।" হ্যালো ওয়ার্ল্ডে, হ্যাঁ। বড় প্রকল্পগুলিতে আমি এই বৈশিষ্ট্যটি অত্যন্ত অবিশ্বাস্য / ধীর পাই। সিটিআরএল + স্পেস, সিটিআরএল + স্পেস, সিটিআরএল + স্পেস, সিআরটিএল + স্পেস, সিটিআরএল + স্পেস, নো গো ...
কোডার

3
একটি নতুন আইডিই পান। বা একটি এসএসডি, যা বিস্ময়ের কাজ করে। অথবা কেবলমাত্র অপ্রয়োজনীয় শিরোনাম অন্তর্ভুক্ত করুন।
ডেডএমজি

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

6

হাঙ্গেরীয় স্বরলিপিটির traditionalতিহ্যবাহী রূপগুলির সাথে অন্য একটি বিষয় হ'ল তারা সাধারণত উপসর্গ। এখানে 2 টি সমস্যা রয়েছে:

1) একজন মানব পাঠক সাধারণত প্রথমে সবচেয়ে গুরুত্বপূর্ণ তথ্য চান, হাঙ্গেরিয়ান বেশিরভাগ ফর্মের মধ্যে এনকোড করা তথ্যের নাম বাদে নিজের চেয়ে কম গুরুত্ব দেওয়া হয়।

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


2

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

  • আরও ক্লাস / প্রকার
  • ছোট পদ্ধতি

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

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

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


1

আমি সি ++ এর প্রসঙ্গে জানি না তবে জাভা / সি # জগতে আমি অর্থবোধক নামগুলি পছন্দ করবো যা আমাকে strFirstNameএকটি স্ট্রিং বলার চেয়ে ডোমেন ভাষা বা প্রসঙ্গে বোঝায়; এটি স্পষ্ট হওয়া উচিত যে এটি একটি স্ট্রিং, বা আরও ভাল অভিপ্রায় জানাতে নামটির পুনঃসংশ্লিষ্ট হওয়া দরকার। আপনি কীসের সাথে কাজ করছেন তার প্রকারটি জানতে যদি আপনার উপসর্গের প্রয়োজন হয় তবে আমি যুক্তি দেব যে আপনার নামটি অসঙ্গতিপূর্ণ, যথেষ্ট বর্ণনামূলক নয় বা সম্পূর্ণ ভুল। আধুনিক ভাষাগুলিতে আমি সবসময় দীর্ঘ নাম পছন্দ করি যা অস্পষ্ট বা অস্পষ্ট নামের চেয়ে কোনও অস্পষ্টতা রাখে না।

শুধুমাত্র সময় আমি হাঙ্গেরীয় ব্যবহার ASP.NET নিয়ন্ত্রণের জন্য, এবং যাতে এর আরো আইএ) সত্যিই দীর্ঘ মত টাইপ করতে হবে না CustomerFirstNameTextBoxবনাম txtCustomerFirstName, এবং বি) তাই Intellisense নিয়ন্ত্রণ ধরনের সব সাজাতে হবে। আমি "নোংরা" বোধ করি এমনকি এটি করে চলেছি, যদিও আমার কাছে আরও একটি ভাল উপায় এখনও খুঁজে পাওয়া যায়নি।


0

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


0

উত্তরটি এই প্রশ্নের মধ্যে রয়েছে: দয়া করে নীচের ভেরিয়েবলগুলির নাম কীভাবে বলবেন:

চর * নালটার্মিনেটেড স্ট্রিং;
ডাব্লুসিএইচআর * নাল টার্মিনেটেড প্রশস্ত স্ট্রিং;
স্ট্রিং স্টলস্ট্রিং;
wstring stl widesString;
সিএসস্ট্রিং এমএফসিস্ট্রিং;
বিএসটিআর কমস্ট্রিং;
_bstr_t atlString;

এই ধ্রুবক স্ট্রিংগুলিতে যুক্ত করুন, এগুলিতে পয়েন্টার এবং এগুলিতে স্থির পয়েন্টার।


3
szFoo, wczFoo, strFoo, (w)strFoo, strFoo, bstrFoo,bstrFoo
সংকেতপদ্ধতিরচয়িতা

0

আপনার বর্ণিত হাঙ্গেরিয়ান স্বরলিপিটির রূপটি আমি দৃ strongly়ভাবে অপছন্দ করি। কারন? এটি 90% সময়ের কোনও বিন্দু পরিবেশন করে না।

উদাহরণস্বরূপ, কোনও উত্তরাধিকার প্রকল্পের কিছুটা (সমতুল্য সি ++। প্রকৃতপক্ষে ডেল্ফিতে লেখা) কোডটি আমি সহ্য করতে বাধ্য হই:

pRecords[0]->FooMember=10;

... পি রেকর্ড একটি পরিবর্তনশীল, এটি টাইপ ট্র্যাকর্ডলিস্ট। TRecordList *pRecords[10];

এটি FooMember নামে একটি ওরিওরটির সমন্বয়ে একটি শ্রেণি যা fFooMember ... বা mFooMembre এর উপর নির্ভর করে এটি যদি "ক্ষেত্র" বা "সদস্য" হয় (ইঙ্গিত: তারা একই জিনিস)

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

এখন, একটি জায়গা আছে যেখানে আমি হানি শিরোনাম ব্যবহার করি। অন্যান্য ইউআই ভেরিয়েবল বা নিয়মিত ভেরিয়েবলের একই নাম থাকতে পারে এমন অনেকগুলি ইউআই ভেরিয়েবলের সাথে কাজ করার সময় এটি হয়।

উদাহরণস্বরূপ, যদি এটিতে আপনার প্রথম নামের জন্য আমার একটি ফর্ম থাকে।

আমার ফার্স্টনেমফর্ম নামে একটি ক্লাস হবে। এর মধ্যে যথাক্রমে লেবেল এবং পাঠ্যবাক্সের জন্য lblFirstName এবং txtFirstName। এবং পাঠ্য বাক্সে নাম পাওয়ার ও সেট করার জন্য সর্বজনীন ফার্স্টনেম সম্পত্তি।

এটি ফার্স্টনামবেল এবং ফার্স্টনেমেক্সটবক্স ব্যবহার করেও সমাধান করা যেতে পারে তবে আমি দেখতে পাই এটি টাইপ করতে দীর্ঘায়িত হয়। বিশেষত জেন্ডারড্রপডাউনলিস্ট এবং এর মতো কিছু নিয়ে।

সুতরাং মূলত, হ্যান্টির স্বরলিপিটি সর্বোপরি পদ্ধতিগত স্তরে বিরক্তিকর এবং সবচেয়ে খারাপ কেস ক্ষতিকারক (অন্য উত্তরগুলি যেমন রিফ্যাক্টরিং এবং ধারাবাহিকতায় সমস্যাগুলি দেয়)।

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