সি # পড়া কি শক্ত হয়ে উঠছে?


15

সি # যেমন উন্নত হয়েছে, ততগুলি ভাষা বৈশিষ্ট্য যুক্ত করা হয়েছে। এটি আমার কাছে এটি অপঠনযোগ্য হয়ে উঠছে।

উদাহরণ হিসাবে, ক্যালিবার্ন থেকে নিম্নলিখিত কোড স্নিপ বিবেচনা করুন ic মাইক্রো কোড এখানে :

            container = CompositionHost.Initialize(
                   new AggregateCatalog(
                      AssemblySource.Instance.
                             Select(x => new AssemblyCatalog(x))
                               .OfType<ComposablePartCatalog>()
                )
            );

এখন এটি একটি ছোট উদাহরণ is

আমার বেশ কয়েকটি প্রশ্ন রয়েছে:

  • এটি কি সাধারণ বা জ্ঞাত সমস্যা?
  • সি # সম্প্রদায় কি একই সন্ধান করছে?
  • এটি কি ভাষার কোনও সমস্যা, বা এটি কী বিকাশকারী দ্বারা ব্যবহার করা স্টাইল?

অন্যদের কোডটি আরও ভালভাবে বোঝার এবং এইভাবে কোড লিখন এড়ানোর কোনও সহজ সমাধান রয়েছে?


6
এটি ল্যাম্বডা ফাংশন, আপনি যতক্ষণ না পেতেন তারা পড়া শক্ত hard
রাইথাল

9
আমি মনে করি আপনি সিনট্যাক্সটি ঠিক তেমন জানেন নি, আপনি যেমন ভাবেন তেমন। অনুশীলন সহ আপনার উদাহরণ পড়া সহজ।
কেওসপ্যান্ডিয়ন

6
@ থমাস ওভেনস: পবিত্র ছিঃ মানুষ, প্রশ্নগুলি সম্পাদন করার জন্য কমপক্ষে কিছু সময় দিন যাতে সেগুলি খোলা থাকে। 15 মিনিট? এখনি আসো.
স্টিভেন এভার্স

4
@ ড্যানিভাইরোড: ১. "না" কোনও গ্রহণযোগ্য উত্তর নয় ২. প্রশ্নটি বন্ধ 3.. আপনি যদি এই বিষয়ে সম্মত হন যে প্রশ্নটি এখানে না হওয়া উচিত তবে পতাকাটি / ভোট দিয়ে এটি বন্ধ করতে হবে বা এটি আরও ভাল হতে হবে সম্পাদনা করুন
স্টিভেন এভার্স

2
@ থরবজর্ন রাভন অ্যান্ডারসন - একটি থাপ্পড় থেকে কেউ কী শিখতে পারে? এটিতে কোনও তথ্য নেই!

উত্তর:


12

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

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

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

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


2
"লিস্প উপভাষাগুলির বিপরীতে যা ব্যবহারিক ভাব প্রকাশের উদ্দেশ্যে হয়" এর অর্থ আপনি কী বোঝাতে পারেন?
জর্জিও

27

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

একই সমস্যা সম্পর্কিত স্ট্যাকওভারফ্লোতে পাওয়া উদাহরণের ভিত্তিতে দুটি নির্দিষ্ট উদাহরণ নিতে পারি, একটি নির্দিষ্ট বৈশিষ্ট্য সহ প্রকারের সন্ধান করে:

সি # 2.0:

static IEnumerable<Type> GetTypesWithAttribute<TAttribute>(bool inherit) 
                              where TAttribute: System.Attribute
{
    foreach(Assembly assembly in AppDomain.Current.GetAssemblies())
    {
        foreach(Type type in assembly.GetTypes()) 
        {
            if (type.IsDefined(typeof(TAttribute),inherit))
                yield return type;
        }
    }
}

সি # 4.0:

IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) 
                              where TAttribute: System.Attribute
{ 
    return from assembly in AppDomain.CurrentDomain.GetAssemblies()
           from type in assembly.GetTypes()
           where type.IsDefined(typeof(TAttribute),inherit)
           select type;
}

আইএমএইচও, নতুন সিনট্যাক্স এটি পড়া অনেক সহজ করে তোলে।


নতুন বাক্য গঠনটি পড়া সহজ, তবে অনুধাবন করা সহজ, যেমনটি হুডের নীচে চলছে? প্রথম উদাহরণটি বোধগম্য, দ্বিতীয়টি আরও পাঠযোগ্য।
নওফাল

4
@ নওফাল আমার অভিজ্ঞতায় লোকেরা লিনাক স্টেটমেন্টের চেয়ে "ফলন রিটার্ন" কন্সট্রাক্টস বুঝতে অনেক বেশি সমস্যায় পড়েছে; সুতরাং আমি তর্ক করব দ্বিতীয়টি আরও পাঠযোগ্য এবং বোধগম্য। প্রসেসর প্রকৃতপক্ষে কীভাবে কাজ করে তা উভয় মানচিত্রই অ্যাবস্ট্রাকশন থেকে হুডের নীচে কী চলছে তা সত্যিই আপনাকে জানায় না।
চুউ

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

8

লিনকিউ যুক্ত করা হলে, এটি প্রচুর সাবলীল শৈলীর পদ্ধতিতে শৃঙ্খলাবদ্ধকরণ এবং ল্যাম্বডাসকে পরামিতি হিসাবে পাস করার কোডিংয়ের একটি স্টাইলকে জনপ্রিয় করে তোলে।

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

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

var assemblyCatalog = AssemblySource.Instance
    .Select(x => new AssemblyCatalog(x))
    .OfType<ComposablePartCatalog>();
var aggregateCatalog = new AggregateCatalog(assemblyCatalog);
container = CompositionHost.Initialize(aggregateCatalog);

1
কোনও নতুন ধরণের তৈরি করা কি অদ্ভুত নয় এবং তার পরে ডাইনামিকভাবে ঠিক সেই ধরণের পরে চলে যেতে হবে?
ডেড এমজি

সম্ভবত, আমি কোড স্নিপেটটির উদ্দেশ্য কী তা সম্পর্কে কোনও সত্য বিবেচনা না করেই কেটে ফেলেছি। কোডটির চেহারাতে কী প্রভাব ফেলবে তা দেখানোর জন্য কেবল সমস্ত তাত্পর্যকে তাদের নিজস্ব কোডের লাইনে বিভক্ত করতে চেয়েছিল।
কারসন 63000

আমি ইন্ডেন্টেশনের জন্য দোষ দিই :()। আসলটি এখানে: devlicio.us/blogs/rob_eisenberg/archive/2010/07/08/…

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

4

আপনার উদাহরণের কোডটি সহজেই পঠনযোগ্য নয় কারণ

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

  • একটি অদ্ভুত সিঙ্গলটন ব্যবহার রয়েছে - AssemblySource.Instance.Select()ইঙ্গিতটি বোঝায় যে একটি আইয়ুনামেবল, যা কিছুটা বিশ্রী।

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

  • আপনি OfType<T>()সদ্য নতুন করে তৈরি করা সামগ্রীর সংগ্রহের মাধ্যমে কেন ফিল্টার করা উচিত তা পরিষ্কার নয় ...

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

আরও সাধারণভাবে, এটি আপনার কোডের পাঠক জানে যে ল্যাম্বডাস কীভাবে কাজ করে তা জেনে রাখে তবে যথেষ্ট নামকরণের মাধ্যমে আপনি প্রায় সর্বদা আপনার কোডটি প্রাক-নেট 3.5 পটভূমির সাথে কারও কাছে পঠনযোগ্য করে তোলার ব্যবস্থা করেন।


2

যে কোনও সময় জনপ্রিয় ভাষার একটি নতুন সংস্করণ নতুন নতুন কাঠামো অর্জন করে, একই রকম বিতর্ক উঠে আসে।

আমার এই সন্দেহগুলি বহু বছর আগেও ছিল (http://gsscoder.blogspot.it/2009/08/use-csharps-features-wisely.html)।

আমার মতে সি # একটি মার্জিত এবং ধারাবাহিকভাবে বিকশিত হচ্ছে।

আপনার নমুনায় কোড জটিল নয়, সম্ভবত আপনি লামদা এক্সপ্রেশন ব্যবহার করছেন না।

সমস্যাটি হ'ল সি # কেবল একটি অবজেক্ট ওরিয়েন্টেড ল্যাঙ্গুয়েজই নয়, এটি এখন কার্যকরী কনস্ট্রাক্টগুলিও সমর্থন করে (http://archive.msdn.microsoft.com/FunctionalCSharp/)।


1

ল্যাম্বদা সিনট্যাক্স বুঝতে আমার কিছুটা সময় লেগেছে, এবং আমি একটি গণিত এবং ফিজিস ব্যাকগ্রাউন্ড থেকে এসেছি। এটি গাণিতিক এক্সপ্রেশনগুলির সাথে কিছুটা মিল, যেমন তারা => এর পরিবর্তে -> ব্যবহার করেন:

গণিতের উদাহরণ এফ (এক্স): = x-> x + 2 এটি "x এর ফাংশন এফ x + 2 এ x মানচিত্র হিসাবে সংজ্ঞায়িত হয়েছে

সি # উদাহরণ ডেল মাইডেলিগেট = এক্স => এক্স +2; এটি "মাইডিলেগেট এমন একটি ফাংশন হিসাবে পড়ে যে মাইডিলেগেট (এক্স) x + 2 থেকে x + 2 এ মানচিত্র করে

গণিত এবং প্রোগ্রামিংয়ের মধ্যে অসঙ্গতি সত্যই কাজে দেয় না, যদিও আমি মনে করি -> ইতিমধ্যে সি ++ তে "সম্পত্তি" (urggh!) হিসাবে গ্রহণ করা হয়েছিল

http://en.wikipedia.org/wiki/List_of_mathematical_symbols


"যদিও আমি মনে করি -> ইতিমধ্যে সি ++ তে" সম্পত্তি "(urgghh!) হিসাবে গ্রহণ করা হয়েছিল" যেন! সি ++ এর মধ্যে খারাপভাবে এর অর্থ "গতিশীলভাবে বরাদ্দকৃত সম্পত্তি ..."। যদি কিছু গতিশীল না হয় আপনি সময়কালটি অন্যান্য ভাষার মতো ব্যবহার করেন।
এমজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.