সি # বা সাধারণভাবে নেট নেট ফ্রেমওয়ার্কের কয়েকটি বৃহত্তম ডিজাইনের ত্রুটিগুলি কী কী?
উদাহরণ: কোনও অ-শনীয় স্ট্রিং টাইপ নেই এবং একটি আইডিটাআডার থেকে মান আনার সময় আপনাকে ডিবিএনল পরীক্ষা করতে হবে।
সি # বা সাধারণভাবে নেট নেট ফ্রেমওয়ার্কের কয়েকটি বৃহত্তম ডিজাইনের ত্রুটিগুলি কী কী?
উদাহরণ: কোনও অ-শনীয় স্ট্রিং টাইপ নেই এবং একটি আইডিটাআডার থেকে মান আনার সময় আপনাকে ডিবিএনল পরীক্ষা করতে হবে।
উত্তর:
আমি এই পোস্টটির সাথে দৃ agree়ভাবে সম্মতি জানাই (যারা টোস্ট্রিংয়ের অভাবে পু-পোয় করছে তাদের জন্য, আপনার শ্রেণীর জন্য একটি কাস্টম ফর্ম্যাট সরবরাহ করার জন্য একটি ডিবাগার বৈশিষ্ট্য রয়েছে)।
উপরের তালিকার শীর্ষে, আমি নিম্নলিখিত যুক্তিসঙ্গত অনুরোধগুলি যুক্ত করব:
T : new(string), বা কোথায়T : new(string, int)var e = new Foo(); e { Bar = baz };Either<T>" এর মতো দক্ষ বদ্ধ বীজগণিতের ধরণটি নয়, তাই আমি একটি বদ্ধ বীজগণিত টাইপ ঘোষণা করার এবং এটির সাথে পরিপূর্ণরূপের প্যাটার্নটি মিলানোর কিছু উপায় পছন্দ করতাম (মূলত দর্শকের প্যাটার্নের জন্য প্রথম শ্রেণির সমর্থন, তবে অনেক বেশি দক্ষ); সুতরাং কেবল এনামগুলি নিন, এগুলিকে পরিপূর্ণ প্যাটার্ন মেলানো সমর্থন দিয়ে প্রসারিত করুন এবং অবৈধ মামলাগুলিকে অনুমতি দিন না,System.IOক্লাসগুলি যেমন Streamকিছুটা খারাপভাবে নকশাকৃত; যে কোনও ইন্টারফেসের নিক্ষেপ করার জন্য কিছু বাস্তবায়ন প্রয়োজন সেগুলি NotSupportedExceptionএকটি খারাপ ডিজাইন,IListএটি তুলনায় অনেক সহজ হতে হবে; আসলে, কংক্রিট সংগ্রহ ইন্টারফেসের অনেকের ক্ষেত্রে এটি সত্য হতে পারে, যেমন ICollection,INotifyPropertyChanged, যা ক্ষেত্রের নামটিকে স্ট্রিং হিসাবে গ্রহণ করে; আপনি কোনও এক্সটেনশন পদ্ধতি ব্যবহার করে এটি করতে পারেন যা কোনও ল্যাম্বদা লাগে MemberExpression, অর্থাত্। () => Fooতবে এটি খুব দক্ষ নয়,
nameof()একক সদস্যের নামের জন্য অপারেটর যুক্ত করেছে , তবে এটি জেনেরিকের সাথে কাজ করে না ( nameof(T) == "T"আসল টাইপ-যুক্তির নামের পরিবর্তে: আপনাকে এখনও করা দরকার typeof(T).Name) - না এটি আপনাকে "পথ" স্ট্রিং পেতে দেয় না উদাহরণস্বরূপ, nameof(this.ComplexProperty.Value) == "Value"এর সম্ভাব্য অ্যাপ্লিকেশনগুলি সীমাবদ্ধ করা।IArithmetic; অন্যান্য দরকারী শেয়ার্ড অপারেটর ইন্টারফেস এছাড়াও সম্ভব,readonlyকীওয়ার্ড ছিল এবং সি # 6.0 কেবল পঠনযোগ্য অটো-বৈশিষ্ট্য যুক্ত করেছে, যদিও এটি অপরিবর্তনীয় প্রকার এবং মানগুলির জন্য সত্য ভাষা সমর্থন হিসাবে কঠোর নয়।আমি এখন মনে করি এটি যথেষ্ট। এগুলি হ'ল গত সপ্তাহে আমি সমস্ত জ্বালা। আমি যদি সত্যিই আমার মনটিতে রাখি তবে আমি সম্ভবত কয়েক ঘন্টা যেতে পারি। সি # 4.0 ইতিমধ্যে নামযুক্ত, alচ্ছিক এবং ডিফল্ট যুক্তি যুক্ত করছে, যা আমি দৃhat়তার সাথে অনুমোদিত।
এখন একটি অযৌক্তিক অনুরোধের জন্য:
খুব দয়া করে? :-)
List<T>এক মিলিয়ন টন পেয়েছি । আপনি কীভাবে প্রস্তাব দেন যে স্ন্যাপশটটি দক্ষতার সাথে নেওয়া হবে? # 21: readonlyকীওয়ার্ডটি ব্যবহার করুন .... এখানে কিছু ভাল পরামর্শ থাকার পরেও সেগুলি বেশিরভাগ ক্ষেত্রেই - পরামর্শগুলি, ত্রুটিগুলি নকশা করে না।
Reset()পদ্ধতির উপর IEnumerator<T>একটা ভুল ছিল (পুনরুক্তিকারীর ব্লক জন্য, ভাষা বৈশিষ্ট এমনকি দাবী যে এই একটি ব্যতিক্রম ছোঁড়ার)IEnumerable<out T>এবং Func<in T, out TResult>তবে কংক্রিটের ধরণের নয় (যেমন List<T>) নয় তেমন কোভারিয়েন্ট / বিপরীত সমর্থন যোগ করা হয়েছে addedApplicationException বরং অনুকূলে পড়ে গেল - এটা কি ভুল ছিল?Contains, তারপর Add,) তাই একটি সংগ্রহ যে স্বতন্ত্র অপারেশন করে সিঙ্ক্রোনাইজ সব দরকারী নয়
System.Collections.ConcurrentTryAddGetOrAddTryRemoveusing/ lockপ্যাটার্ন দিয়ে তৈরি করা যেতে পারে - সম্ভবত তাদের পুনরায় ব্যবহারযোগ্য (এক্সটেনসিবল?) সিনট্যাক্স ভাগ করার অনুমতি দেয়; আপনি ফিরে IDisposableএবং ব্যবহার করে usingএটি অনুকরণ করতে পারেন , তবে এটি আরও পরিষ্কার হতে পারেFoo(SqlConnection! connection)(এটি একটি নাল-চেক / ইনজেকশন দেয় throw) চমৎকার হবে ( int?ইত্যাদির বিপরীতে )
dynamicবা আপনি এটি এটি সক্ষম করতে পারেনforeachসম্প্রসারণ, যার মানে হল অতি শীঘ্র-পদ্ধতি / lambdas একক পরিবর্তনশীল ক্যাপচার বদলে পুনরাবৃত্তির প্রতি এক (সঙ্গে থ্রেডিং / ASYNC জন্য / etc বেদনাদায়ক)
ApplicationExceptionএটি একটি ভুল ছিল - তারা যেমন আশা করেছিল তেমন কার্যকর নয়। তারাও বলেছিল যে System.Exceptionহওয়া উচিত ছিল abstract।
টেক্সট রাইটার স্ট্রিম রাইটারের একটি বেস ক্লাস। ডাব্লুটিএফ?
যা আমাকে সর্বদা চরমভাবে বিভ্রান্ত করে।
একটি ছোট সি # পোষা প্রাণী - নির্মাণকারীরা বর্গ হিসাবে একই নাম নির্মাতাকে থাকার সি ++ / জাভা বাক্য গঠন ব্যবহার করে synt
New()বা ctor()অনেক ভাল হত।
এবং নিশ্চিত, কোডারুশের মতো সরঞ্জামগুলি ক্লাসের নামকরণের জন্য এটিকে কম সমস্যা তৈরি করে, তবে একটি পঠনযোগ্যতা পিওভি, নিউ () থেকে দুর্দান্ত স্পষ্টতা সরবরাহ করে।
class Foo { new(int j) {i = j} int i; }
New-প্রেসকেস কীওয়ার্ডগুলি কনভেনশনবিরোধী নয় ), তবে আমি একে ডিজাইনের ত্রুটি বলতে দ্বিধা বোধ করি। তারা বিদ্যমান সি ++ / জাভা বিকাশকারীদের আকর্ষণ করতে চেয়েছিল এবং প্রচুর বোকা পুরানো সিনট্যাকটিক সম্মেলনগুলি তর্কসাপেক্ষভাবে তাদের লক্ষ্যে পৌঁছাতে সহায়তা করেছিল।
আমি বুঝতে পারি না যে আপনি পারবেন না
যেখানে টি: নতুন (ইউ)
সুতরাং আপনি ঘোষণা করেন যে জেনেরিক টাইপ টিতে একটি অ-ডিফল্ট কনস্ট্রাক্টর রয়েছে।
সম্পাদনা করুন:
আমি এটা করতে চাই:
public class A
{
public A(string text)
{
}
}
public class Gen<T> where T : new(string text)
{
}
আমি সত্যিই অবাক হয়েছি যে আমি এটির প্রথম উল্লেখ করেছি:
ADO.NET টাইপ করা ডেটা সেটগুলি nlalable প্রকারের বৈশিষ্ট্য হিসাবে নমনীয় কলামগুলি প্রকাশ করে না। আপনার এটি লিখতে সক্ষম হওয়া উচিত:
int? i = myRec.Field;
myRec.Field = null;
পরিবর্তে, আপনাকে এটি লিখতে হবে, যা কেবল বোকা:
int? i = (int?)myRec.IsFieldNull() ? (int?)null : myRec.Field;
myRec.SetFieldNull();
এটি নেট .০.০ এ বিরক্তিকর ছিল, এবং এটি এখন আরও বিরক্তিকর যে আপনাকে আপনার সুন্দর ঝরঝরে লিনকুই ক্যোয়ারিতে উপরের মতো জিগি-পোকারি ব্যবহার করতে হবে।
এটি বিরক্তিকর যে উত্পন্ন Add<TableName>Rowপদ্ধতিটি একই ধরণের নালাগুলির ধারণার প্রতি সংবেদনশীল। উত্পন্ন TableAdapterপদ্ধতিগুলি না হওয়ায় আরও বেশি ।
নেট তে খুব বেশি কিছু নেই যা দেব দলটির মতো আমাকে অনুভব করে বলেছিল "ঠিক আছে ছেলেরা, আমরা যথেষ্ট কাছে এসেছি - শিপ!" তবে এটি নিশ্চিত করে।
DBNull.Value, যখন nullনিজেই NULL উপস্থাপনের জন্য যথেষ্ট উপযুক্ত হত। ভাগ্যক্রমে লিনিক-টু-এসকিউএল কেবল নুলের জন্য নাল ব্যবহার করে।
আমার সম্পাদনা
৫. আমার আরেকটি বিরক্তি হ'ল কীভাবে সিস্টেম.রিফ্লেশন.বাইন্ডিং ফ্ল্যাজেসের পদ্ধতিটি আপনার ব্যবহারের উপর নির্ভর করে বিভিন্ন ব্যবহার করে। ফাইন্ডফিল্ডগুলিতে উদাহরণস্বরূপ ক্রিয়েটইনস্টান্স বা সেটফিল্ড বলতে কী বোঝায়? এটি এমন একটি ক্ষেত্রে যেখানে তারা এই গণনার পিছনে অর্থটি বোঝা ফেলেছে যা বিভ্রান্তিকর।
আমি জানি না যে আমি এটির ডিজাইনের ত্রুটি বলতে যতদূর যেতে পারব, তবে আপনি যদি ভিবিতে যেভাবে ল্যাম্বডা এক্সপ্রেশনটি করতে পারেন ঠিক তেমনভাবেই অনুগ্রহ করতে পারলে এটি খুব সুন্দর হবে:
ভিবি:
Dim a = Function(x) x * (x - 1)
সি #
এটি করতে পারলে ভাল হত:
var a = x => x * (x - 1);
এটি করার পরিবর্তে:
Func<int, int> a = x => x * (x - 1);
আমি বুঝতে পারি যে এটি বেশি দিন নয়, তবে কোড গল্ফে প্রতিটি চরিত্রই গুনে গুনে! তারা যখন এই প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি ডিজাইন করে তখন তারা কি তা বিবেচনায় রাখে না? :)
(int x) => x * (x -1);অর্থ হতে পারে Func<int, int>বা এর অর্থ হতে পারেExpression<Func<int, int>>
+এটির জন্য সংজ্ঞা দেওয়া হয়নি object।
System.Object শ্রেণী:
সমান এবং গেটহ্যাশকোড - সমস্ত শ্রেণীর তুলনাযোগ্য বা হ্যাশযোগ্য নয়, একটি ইন্টারফেসে স্থানান্তরিত হওয়া উচিত। আইক্যায়েটেবল বা আইকোম্যাপারেবল (বা অনুরূপ) মনে আসে।
টোস্ট্রিং - সমস্ত শ্রেণি স্ট্রিংয়ে রূপান্তরিত হতে পারে না, কোনও ইন্টারফেসে স্থানান্তরিত হওয়া উচিত। আইফোর্মেটেবল (বা অনুরূপ) মাথায় আসে।
ICollection.SyncRoot সম্পত্তি:
জেনারিকস শুরু থেকেই সেখানে থাকা উচিত ছিল:
EqualityComparer<T>.Defaultসঠিকভাবে আপডেট করা। তারপরে var dict = new Dictionary<object, string>(EqualityComparer<object>.Default)এবং উভয়ই var dict = new Dictionary<object, string>()রেফারেন্স তুলনা / সাম্য ব্যবহার করবে।
EqualityComparer<T>.Defaultকরে। প্রতিটি দেখার জন্য চেক করার প্রয়োজন নেই। তুলনাকারী Dictionaryউদাহরণস্বরূপ একটি সম্পত্তি , এবং প্রত্যেকে Dictionaryজানে যে এটি কোনটি ব্যবহার করছে।
আমার বিরক্তিকর জিনিসগুলির মধ্যে একটি হ'ল Predicate<T> != Func<T, bool>প্যারাডক্স। তারা উভয় প্রকারের প্রতিনিধি T -> boolএবং তবুও তারা নিয়োগের সাথে সামঞ্জস্যপূর্ণ নয়।
কিছু লোক (আইএসভি) আশা করেন যে আপনি এটি নির্মাণের সময় মেশিন কোডে সংকলন করতে এবং এটির সাথে লিঙ্ক করতে পারেন, এমন কোনও নেটিভ এক্সিকিউটেবল তৈরি করতে যাতে ডটনেট রান-টাইমের প্রয়োজন হয় না।
সঠিক ওও কৌশল সম্পর্কে আমরা অনেক কিছু জানি । চুক্তি অনুসারে প্রোগ্রামিং করা, অনুচিত উত্তরাধিকার এড়ানো, ব্যতিক্রমগুলির যথাযথ ব্যবহার, উন্মুক্ত / বদ্ধ প্রিন্সিপাল, লিসকভের বিকল্প পরিবর্তন ইত্যাদি। এখনও, নেট ফ্রেমওয়ার্কগুলি সেরা অনুশীলনগুলিকে নিয়োগ করে না।
আমার কাছে ডিজাইনের একক বৃহত্তম ত্রুটি। নেট দৈত্যদের কাঁধে দাঁড়িয়ে নেই; তাদের ফ্রেমওয়ার্কগুলি ব্যবহার করে এমন প্রোগ্রামারদের জনগণের কাছে আদর্শ প্রোগ্রামিং দৃষ্টান্তের চেয়ে কম প্রচার করা ।
এমএস যদি এটি মনোযোগ দেয় তবে সফটওয়্যার ইঞ্জিনিয়ারিং ওয়ার্ল্ড এই দশকে গুণমান, স্থিতিশীলতা এবং স্কেলিবিলিটির দিক থেকে দুর্দান্ত লাফিয়ে উঠতে পারত, তবে হায় আফসোস, এটি পুনরায় চাপ দিচ্ছে বলে মনে হচ্ছে।
আমি সি # সুইচ বিবৃতি পছন্দ করি না।
আমি এরকম কিছু চাই
switch (a) {
1 : do_something;
2 : do_something_else;
3,4 : do_something_different;
else : do_something_weird;
}
সুতরাং আর বিরতি নেই (ভুলে যাওয়া সহজ) এবং বিভিন্ন মানকে কমা-পৃথক করার সম্ভাবনা।
switchসি এর ইচ্ছাকৃত পঙ্গু সংস্করণ (গতির জন্য অনুকূলিত!) নকল করে এমন সমস্ত ভাষায় মৌলিকভাবে ভাঙা হয়েছে। ভিবি ভাড়া আরও উন্নত, তবে প্যাটার্ন মেলানো (হ্যাস্কেল, এফ #…) সহ ভাষার তুলনায় হালকা বছর রয়েছে।
সি # তে ইভেন্টগুলি, যেখানে আপনাকে শ্রোতাদের জন্য সুস্পষ্ট চেক করতে হবে। যে ঘটনাটি ঘটেছে, সেখানে উপস্থিত হওয়ার জন্য যারা সম্প্রচার করছিল সেটাই ছিল না? কিছু না থাকলেও?
নেস্টেড / পুনরাবৃত্ত পুনরাবৃত্তকারীগুলির ঘৃণ্য (এবং বেশিরভাগ লোকের কাছে বেশ অদৃশ্য) ও (এন ^ 2) আচরণ ।
আমি বেশ আগ্রহী যে তারা এ সম্পর্কে জানে, কীভাবে এটি ঠিক করতে হয় তা জানেন তবে এটি যোগ্যতার অন্তর্ভুক্তির পর্যাপ্ত অগ্রাধিকার হিসাবে দেখা হয় না।
আমি গাছের মতো গাছের সাথে সর্বদা কাজ করি এবং অন্যথায় স্মার্ট লোকের কোডটি সংশোধন করতে হয় যখন তারা অজান্তেই এইভাবে অত্যন্ত ব্যয়বহুল ক্রিয়াকলাপগুলি প্রবর্তন করে।
"ফলন ফোরচ" এর সৌন্দর্যটি হ'ল সহজ, সহজ বাক্য গঠন সঠিক, পারফরম্যান্ট কোডকে উত্সাহ দেয় This এটি "সাফল্যের গর্ত" যা আমি মনে করি প্ল্যাটফর্মের দীর্ঘমেয়াদী সাফল্যের জন্য নতুন বৈশিষ্ট্য যুক্ত করার আগে তাদের উত্সাহিত করা উচিত।
কিছু শ্রেণীর উদাহরণস্বরূপ এরে কার্যকরী IList, ইন্টারফেসগুলি বাস্তবায়ন কিন্তু তারা এটি ইন্টারফেসের পদ্ধতির অনেক বাস্তবায়ন না কিন্তু 9 খুঁজে 4 পদ্ধতি নিক্ষেপ NotSupportedException http://msdn.microsoft.com/en-us/library/system.array_members .aspx
ইন্টারফেসে স্থির সদস্য এবং নেস্টেড প্রকারগুলি।
এটি বিশেষত কার্যকর যখন ইন্টারফেসের সদস্যের কাছে ইন্টারফেসের সাথে নির্দিষ্ট ( যেমন একটি enum) পরামিতি থাকে । ইন্টারফেস টাইপের এনাম টাইপটি বাসা বাঁধাই ভাল লাগবে।
ঘটনার ভয়াবহ বিপজ্জনক ডিফল্ট প্রকৃতি। গ্রাহকরা অপসারণের কারণে আপনি কোনও ইভেন্টটিকে কল করতে এবং অসামঞ্জস্য অবস্থায় থাকতে পারেন তা সত্যই ভয়ঙ্কর। দেখুন জন স্কিট এর এবং এরিক Lippert এর বিষয় আরও পড়ার জন্য চমৎকার নিবন্ধ।
null সর্বত্র
const কোথাও.
এপিআইগুলি অসঙ্গত, যেমন একটি অ্যারের রিটার্নকে রূপান্তরিত করে voidতবে StringBufferএকই রিটার্নে কোনও রিটার্নে সংযোজন StringBuffer।
সংগ্রহ ইন্টারফেসগুলি অপরিবর্তনীয় ডাটা স্ট্রাকচার সাথে বেমানান, যেমন Addমধ্যে System.Collections.Generic.IList<_>একটি ফলাফল দেখাবে করতে পারবে না।
কোনও কাঠামোগত টাইপিং নেই যাতে আপনি ন্যায়বিচারের System.Windows.Media.Effects.SamplingMode.Bilinearপরিবর্তে লেখেন Bilinear।
IEnumeratorক্লাস দ্বারা কার্যকর মিউটেবল ইন্টারফেস যখন এটি অপরিবর্তনীয় হওয়া উচিত struct।
সমতা ও তুলনা একটি জগাখিচুড়ি আছেন: আপনি পেয়েছেন System.IComparableএবং Equalsকিন্তু তারপর আপনার কাছে পেয়েছেন System.IComparable<_>, System.IEquatable, System.Collections.IComparer, System.Collections.IStructuralComparable, System.Collections.IStructuralEquatable, System.Collections.Generic.IComparerএবং System.Collections.Generic.IEqualityComparer।
টিপলসগুলি স্ট্রাক্ট হওয়া উচিত তবে স্ট্রাকগুলি অযথা টেল কল নির্মূলকরণকে বাধা দেয় তাই সর্বাধিক সাধারণ এবং মৌলিক ডেটা ধরণের একটি অপ্রয়োজনীয়ভাবে বরাদ্দ করে এবং স্কেলযোগ্য সমান্তরালতাটিকে ধ্বংস করে destroy
IEnumerator?
এনাম হিসাবে 0 চাঁদনি
enum নিজস্ব চালচলন: http://blogs.msdn.com/abhinaba/archive/2007/01/09/more-peculiarites-of-enum.aspx
এই ভাল উদাহরণ দ্বারা চিত্রিত: http://plus.kaist.ac.kr/~shoh/postgresql/Npgsql/apidocs/Npgsql.NpgsqlParameter संग्रह
আমার পরামর্শ, "@" চিহ্নটি ভাল ব্যবহারের জন্য রাখুন:
পরিবর্তে:
যদি ((myVar এবং MyEnumName.ColorRed)! = 0)
এটা ব্যবহার কর:
যদি ((মাইভার এবং মাইএননাম.কালার রেড)! = @ 0)
অন্যদের ইতিমধ্যে তৈরি করা ভাল পয়েন্টগুলির দীর্ঘ তালিকায় যুক্ত করতে:
DateTime.Now == DateTime.Now বেশিরভাগ ক্ষেত্রে, তবে সব ক্ষেত্রে নয়।
Stringযা অপরিবর্তনীয় তার নির্মাণ ও কারসাজির জন্য একগুচ্ছ বিকল্প রয়েছে, তবে StringBuilder(যা পরিবর্তনযোগ্য) তা নয়।
Monitor.Enterএবং Monitor.Exitউদাহরণস্বরূপ পদ্ধতিগুলি হওয়া উচিত ছিল, তাই লক করার জন্য কোনও নির্দিষ্ট অবজেক্টটি নতুন করার পরিবর্তে আপনি নতুনটি তৈরি করতে Monitorএবং এতে লক করতে পারেন।
ধ্বংসকারীদের কখনও ডেস্ট্রাক্টর নামকরণ করা উচিত ছিল না। ইসিএমএ স্পেক তাদের চূড়ান্ত বলে ডাকে, যা সি ++ জনতার পক্ষে অনেক কম বিভ্রান্তিকর, তবে ভাষার স্পেসিফিকেশন এখনও তাদেরকে ধ্বংসকারী হিসাবে উল্লেখ করে।
DateTime.Nowএক বিশ্বের সবচেয়ে সুস্পষ্ট জাতি অবস্থা, কিন্তু + 1 বাকি জন্য
আমরা যেভাবে সম্পত্তি ব্যবহার করি তা আমাকে মাঝে মাঝে বিরক্ত করে। আমি তাদের জাভা এর getFoo () এবং setFoo () পদ্ধতির সমতুল্য হিসাবে ভাবতে চাই। কিন্তু তারা না।
যদি সম্পত্তি ব্যবহারের নির্দেশিকাগুলি উল্লেখ করে যে সম্পত্তিগুলি কোনও ক্রমে সেট করতে সক্ষম হওয়া উচিত যাতে সিরিয়ালাইজেশন কাজ করতে পারে, তবে সেটার-সেট বৈধতার জন্য তারা অকেজো। আপনি যদি এমন কোনও ব্যাকগ্রাউন্ড থেকে এসে থাকেন যেখানে আপনি কোনও অবজেক্টকে নিজেকে কোনও অবৈধ অবস্থায় যাওয়ার অনুমতি থেকে বিরত রাখতে চান, তবে বৈশিষ্ট্যগুলি আপনার সমাধান নয়। কখনও কখনও আমি জনসাধারণের সদস্যদের চেয়ে কীভাবে উন্নত তা দেখতে ব্যর্থ হই, কারণ আমরা সম্পত্তিতে কী ধরণের জিনিসগুলি করার কথা তা সীমাবদ্ধ ।
সে লক্ষ্যে আমি সর্বদা এক ধরণের আকাঙ্ক্ষা করেছি (এটি বেশিরভাগ সময় এখানে উচ্চস্বরে চিন্তা করেই চলেছে, আমি কেবল একধরনের ইচ্ছুক আমি এই জাতীয় কিছু করতে পারি) যা আমি সম্পত্তি সংশ্লেষকে একরকম প্রসারিত করতে পারি। এরকম কিছু কল্পনা করুন:
private string password;
public string Password
{
// Called when being set by a deserializer or a persistence
// framework
deserialize
{
// I could put some backward-compat hacks in here. Like
// weak passwords are grandfathered in without blowing up
this.password = value;
}
get
{
if (Thread.CurrentPrincipal.IsInRole("Administrator"))
{
return this.password;
}
else
{
throw new PermissionException();
}
}
set
{
if (MeetsPasswordRequirements(value))
{
throw new BlahException();
}
this.password = value;
}
serialize
{
return this.password;
}
}
আমি নিশ্চিত নই যে এটি দরকারী বা এটির মধ্যে কী কী অ্যাক্সেস রয়েছে তা দেখতে ভাল লাগবে। তবে আমি কেবল চাই যে আমি সম্পত্তিগুলির সাথে আরও বেশি কিছু করতে পারি এবং সত্যিই তাদের পেতে এবং সেট করার পদ্ধতিগুলির মতো আচরণ করি।
এক্সটেনশন পদ্ধতিগুলি দুর্দান্ত তবে তারা মিক্সিনসের বিষয়ে সমস্যাগুলি সমাধান করার একটি কুশল উপায় যা আসল মিক্সিনগুলি দিয়ে ক্লিনার সমাধান করা যেতে পারে (আমি কী বলছি তা দেখতে রুবি দেখুন)। তাদের ভাষায় যুক্ত করার একটি দুর্দান্ত উপায় হ'ল জেনারিকদের উত্তরাধিকারের জন্য ব্যবহার করার অনুমতি দেওয়া। এটি আপনাকে একটি দুর্দান্ত অবজেক্ট ওরিয়েন্টেড উপায়ে বিদ্যমান ক্লাসগুলি প্রসারিত করতে দেয়:
public class MyMixin<T> : T
{
// etc...
}
একটি স্ট্রিং প্রসারিত করতে এটি এটির মতো ব্যবহার করা যেতে পারে:
var newMixin = new MyMixin<string>();
এটি এক্সটেনশন পদ্ধতির তুলনায় অনেক বেশি শক্তিশালী কারণ এটি আপনাকে পদ্ধতিগুলিকে ওভাররাইড করতে দেয়, উদাহরণস্বরূপ এগুলিকে মোড়ানো করতে ভাষার অভ্যন্তরে এওপি-জাতীয় কার্যকারিতা সরবরাহ করে।
ভাড়ার জন্য দুঃখিত :-)
মাইক্রোসফ্ট ফ্রেমওয়ার্কে সুস্পষ্ট বাগগুলি ঠিক করবে না এবং হুক সরবরাহ করবে না যাতে শেষ ব্যবহারকারীরা তাদের ঠিক করতে পারেন।
এছাড়াও, বাইনারি-প্যাচ করার কোনও উপায় নেই। রানটাইম সময়ে নেট এক্সিকিউটেবল এবং নেটিক লাইব্রেরিগুলিকে প্যাচিং ছাড়া লোড কলটি (লোড কলটি আটকাতে) ব্যতীত .NET ফ্রেমওয়ার্ক লাইব্রেরির ব্যক্তিগত সংস্করণ নির্দিষ্ট করার কোনও উপায় নেই এবং ILDASM পুনরায় বিতরণযোগ্য নয় তাই আমি স্বয়ংক্রিয় করতে পারি না প্যাচ যাইহোক।
নাল ভেরিয়েবলের উপর একটি এক্সটেনশন পদ্ধতির আবেদন করতে সক্ষম হ'ল তর্কযোগ্য উদাহরণ
অবজেক্ট a = নাল; a.MyExtMethod (); // এটি কলযোগ্য, ধারণা করুন কোথাও এটি MyExtMethod সংজ্ঞায়িত করেছে
এটি সুবিধাজনক হতে পারে তবে নাল রেফারেন্স ব্যতিক্রম বিষয়গুলিতে এটি অস্পষ্ট।
একটি নামকরণ 'ত্রুটি' System.configration.dll এ "কনফিগারেশন" এর 'সি' মূলধনী করা উচিত।
ব্যতিক্রম হ্যান্ডলিং. ব্যতিক্রমটি জোর মতো ধরা বা নিক্ষেপ করা উচিত জাভার মতো, সংকলকটি সংকলনের সময় এটি পরীক্ষা করা উচিত। ব্যবহারকারীদের লক্ষ্য আহ্বানের মধ্যে ব্যতিক্রম তথ্যের জন্য মন্তব্যে নির্ভর করা উচিত নয়।
ফ্রেমওয়ার্কের ভি 1 এর স্ক্যালকম্যান্ডে .Paraters.Add () পদ্ধতিটি মারাত্মকভাবে ডিজাইন করা হয়েছিল - আপনি যদি 0 এর মান (int) দিয়ে কোনও প্যারামিটারে পাস করেন তবে ওভারলোডগুলির মধ্যে একটি মূলত কাজ করবে না - এটি তাদের তৈরি করতে পরিচালিত করে স্ক্যালকমন্ড ক্লাসে .Paraters.AdWithValue () পদ্ধতিটি।
ICollection<T>এবং IList<T>; সর্বনিম্ন, একটি কোভেরিয়েন্ট রিড-ওনলি সংগ্রহের ইন্টারফেস IListSource<out T>(একটি এনুমरेटर, সূচক এবং গণনা সহ) অত্যন্ত কার্যকর হত।Transform(Sequence<T>, Func<T,T>)ফাংশন লিখছিলাম যা ফাংশনটি একই মান বা অন্য কোনও মান দেয় কিনা তা দ্রুত নির্ধারণ করা দরকার। যদি ফাংশনটি তার / বেশিরভাগ আর্গুমেন্টকে সংশোধন না করে তবে আউটপুট ক্রমটি ইনপুট ক্রম থেকে কিছু / সমস্ত মেমরি ভাগ করতে পারে। কোনও মানের ধরণের টিকে বিটওয়াইজ করার তুলনা করার ক্ষমতা ছাড়াই অনেক ধীর গতির তুলনা অবশ্যই ব্যবহার করা উচিত, যা পারফরম্যান্সকে প্রচণ্ড আঘাত দেয়।List<T>অনুমানের IListSource<U>(যেখানে টি: ইউ) কাস্ট করার অনুমতি দেয়। এই কার্যকারিতা সরবরাহ করার জন্য কমপক্ষে তিনটি পৃথক গ্রন্থাগার রয়েছে (স্বতন্ত্রভাবে লিখিত) (পারফরম্যান্সের ত্রুটিগুলি সহ, অবশ্যই - যদি একটি নিখুঁত কাজ সম্ভব হয়, তবে এটি নেট। এ ত্রুটি বলা ভাল হবে না)।WeakReference<T>(আপনি সহজেই নিজের লেখা লিখতে পারেন তবে এটি অভ্যন্তরীণভাবে কাস্ট ব্যবহার করবে))Predicate<T>বনাম Func<T,bool>)। আমি প্রায়শই ইচ্ছে করি যে আমরা ইন্টারফেস এবং প্রতিনিধিদের জন্য কাঠামোগত টাইপিংয়ের সাথে উপাদানগুলির মধ্যে আলগা দম্পতি অর্জন করতে পারতাম , কারণ .NET এ স্বাধীন ইন্টারন্যাশনাল ডিএলএলগুলিতে একই ইন্টারফেসটি প্রয়োগ করা যথেষ্ট নয় - তাদের অবশ্যই একটি তৃতীয়টির সাথে একটি সাধারণ রেফারেন্স শেয়ার করতে হবে ইন্টারফেসটি সংজ্ঞায়িত করে এমন ডিএলএল।DBNull.Valuenullএকই উদ্দেশ্য সমানভাবে পরিবেশন করা সত্ত্বেও বিদ্যমান ।variable = variable ?? value। আসলে, সি # তে কয়েকটি জায়গা রয়েছে যে অকারণে প্রতিসাম্যের ঘাটতি রয়েছে। উদাহরণস্বরূপ আপনি লিখতে পারেন if (x) y(); else z();(ধনুর্বন্ধনী ছাড়া), তবে আপনি লিখতে পারবেন না try y(); finally z();।IList<T>, যদিও আমি ব্যবহার করেছি IReadableByIndex<out T>এবং IAppendable<in T>। আপনার অন্যান্য জিনিসগুলির মধ্যে অনেকগুলি হ'ল ঝগড়াটে আমিও এর সাথে একমত হই।
IListReader<T>;) - আমি "উত্স" শব্দটি "সিঙ্ক" (একটি লেখার জন্য কেবল ইন্টারফেস) এর প্রতিশব্দ হিসাবে ব্যবহার করি।
IListSource<in T>বা IReadableList<out T>। বেস ইন্টারফেসের ধরণের পদ্ধতিগুলির মধ্যে এমন পদ্ধতি রয়েছে যা সমস্ত ডেরাইভেটিভগুলিতে বিদ্যমান নেই এর মধ্যে মূল্য থাকতে পারে, যদিও আমি মনে করি যে ইন্টারফেসগুলি কিছুটা বিশেষায়িত করা প্রায়শই ভাল। উদাহরণস্বরূপ, IList<T>কারওর মধ্যে পুনরায় আকার দেওয়ার পদ্ধতি থাকতে পারে যা কাজ করতে পারে বা না পারে এবং একটি IResizableList<T>একই পদ্ধতি প্রয়োগ করে তবে তাদের কাজ করার নিশ্চয়তা দেয়। এই ক্ষেত্রে এমন ক্ষেত্রে কার্যকর হতে পারে যেখানে ক্ষেত্রটি কেবলমাত্র একটি পরিবর্তনীয় তালিকার একমাত্র বিদ্যমান রেফারেন্স, বা একটি অপরিবর্তনীয় ক্ষেত্রে ভাগ করে নেওয়া রেফারেন্স ধারণ করতে পারে।
if (rl:(list as IResizableList<T>) != null) rl.Add(...);, তবে অন্যান্য প্রস্তাব রয়েছে। বিভিন্ন সংগ্রহ এবং সংগ্রহের অ্যাডাপ্টারগুলির লেখক হিসাবে, আমাকে যেটা উদ্বেগ দিচ্ছে তা ব্যতিক্রম ছড়িয়ে দেওয়ার প্রচুর ডামি পদ্ধতি লিখছে writing প্রকার সুরক্ষা অনুরাগী হিসাবে, আমি অবৈধ পদ্ধতিতে কল করতে দেওয়া হতে চাই না। ইন্টেলিসেন্সের অনুরাগী, আমি তাদের তালিকাভুক্ত দেখতে চাই না।
একটা জিনিষ আমার 1.x বন্ধ টিক যখন ব্যবহার ছিল System.Xml.XmlValidatingReader, ValidationEventHandlerএর ValidationEventArgsএক্সপোজ নেই রেখাঙ্কিত XmlSchemaException(অভ্যন্তরীণ চিহ্নিত) যা মত সব দরকারী তথ্য রয়েছে linenumberএবং position। পরিবর্তে আপনি বার্তা স্ট্রিংয়ের সম্পত্তি থেকে এটি পার্স করার বা এটি খনন করতে প্রতিবিম্বটি ব্যবহার করার প্রত্যাশা করছেন। যখন আপনি শেষ ব্যবহারকারীর কাছে আরও স্যানিটাইজড ত্রুটি ফিরিয়ে দিতে চান তখন খুব ভাল হয় না।
এটি পছন্দ করবেন না যে আপনি অন্য এনামে একটি এনমের মান ব্যবহার করতে পারবেন না, উদাহরণস্বরূপ:
enum Colors { white, blue, green, red, black, yellow }
enum SpecialColors { Colors.blue, Colors.red, Colors.Yellow }
typeof(Color)! = typeof(SpecialColors)।
enum SpecialColors { blue = Colors.blue, red = Colors.red, yellow = Colors.Yellow }
সুস্পষ্টভাবে টাইপড ভেরিয়েবলগুলি দুর্বল আইএমও প্রয়োগ করা হয়েছিল। আমি জানি লিনক এক্সপ্রেশন নিয়ে কাজ করার সময় আপনার কেবল সত্যই সেগুলি ব্যবহার করা উচিত তবে এটি বিরক্তিকর যে আপনি স্থানীয় আওতার বাইরে এগুলি ঘোষণা করতে পারবেন না।
এমএসডিএন থেকে:
আমার মনে হয় এটির একটি খারাপ বাস্তবায়ন হ'ল তারা এটিকে ভার বলে, তবে এটি বৈকল্পিক হওয়া থেকে অনেক দূরে। পুরো ক্লাসের নাম টাইপ না করার জন্য এটি কেবলমাত্র শর্টহ্যান্ড সিনট্যাক্স (লিনকের সাথে ব্যবহার করা বাদে)