প্যারামিটারের নামটি প্রতিফলিত করছে: সি # ল্যাম্বডা এক্সপ্রেশন বা সিনট্যাক্স উজ্জ্বলতার অপব্যবহার?


428

আমি এমভিসিএন্ট্রিবিড গ্রিড উপাদানটি দেখছি এবং আমি মুগ্ধ, তবু একই সময়ে গ্রিড সিনট্যাক্সে ব্যবহৃত সিন্ট্যাকটিক ট্রিক দ্বারা বিতাড়িত :

.Attributes(style => "width:100%")

উপরের সিনট্যাক্সটিতে উত্পন্ন HTML এর শৈলীর বৈশিষ্ট্যটি সেট করে width:100%। এখন আপনি যদি মনোযোগ দিন, 'স্টাইল' কোথাও নির্দিষ্ট নেই, এক্সপ্রেশনটির প্যারামিটারের নাম থেকে বাদ দেওয়া হয় ! আমাকে এটি খনন করতে হয়েছিল এবং খুঁজে পেলাম যেখানে 'যাদু' ঘটেছিল:

Hash(params Func<object, TValue>[] hash)
{
    foreach (var func in hash)
    {
        Add(func.Method.GetParameters()[0].Name, func(null));
    }
}

সুতরাং প্রকৃতপক্ষে, কোডটি আনুষ্ঠানিক, সংকলন সময়, প্যারামিটারগুলির নাম ব্যবহার করে অ্যাট্রিবিউট নাম-মান জোড়ার অভিধান তৈরি করতে হবে। ফলাফলের বাক্য গঠনটি প্রকৃতপক্ষে অত্যন্ত উদ্বেগজনক তবে একই সময়ে অত্যন্ত বিপজ্জনক। ল্যাম্বডা এক্সপ্রেশনগুলির সাধারণ ব্যবহার পার্শ্ব প্রতিক্রিয়া ছাড়াই ব্যবহৃত নামগুলি প্রতিস্থাপনের অনুমতি দেয় । আমি একটি বইতে একটি উদাহরণ দেখি যা বলে যে collection.ForEach(book => Fire.Burn(book))আমি জানি আমি আমার কোডটিতে লিখতে পারি collection.ForEach(log => Fire.Burn(log))এবং এর অর্থ একই জিনিস । তবে হঠাৎ করেই এখানে এমভিসিএন্ট্রিবিড গ্রিড সিনট্যাক্সের সাথে আমি খুঁজে পেয়েছি যে কোডগুলি আমার ভেরিয়েবলগুলির জন্য চয়ন করা নামগুলির ভিত্তিতে সক্রিয়ভাবে দেখায় এবং সিদ্ধান্ত নেয়!

তাহলে কি এই সাধারণ অভ্যাসটি সি # 3.5 / 4.0 সম্প্রদায় এবং ল্যাম্বডা এক্সপ্রেশন প্রেমীদের সাথে? বা একটি দুর্বৃত্ত ওয়ান ট্রিক ম্যাভেরিক আমার সম্পর্কে চিন্তা করা উচিত নয়?


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

190
আমি কেবল অ্যান্ডার্সকে (এবং বাকী নকশা দলকে) জিজ্ঞাসা করেছি তারা কী ভেবেছিল। আসুন কেবল বলি ফলাফল পারিবারিক-বন্ধুত্বপূর্ণ সংবাদপত্রে মুদ্রণযোগ্য হবে না।
এরিক লিপার্ট

22
সি # বর্তমানে মানচিত্রের জন্য একটি পরিষ্কার, হালকা বাক্য গঠন অনুপস্থিত, বিশেষত মানচিত্রগুলিতে ফাংশনগুলিতে প্রেরণ করা হয়েছে। বিভিন্ন গতিশীল ভাষাগুলি (রুবি, পাইথন, জাভাস্ক্রিপ্ট, কোল্ডফিউশন 9) এর জন্য একটি পরিষ্কার, হালকা বাক্য গঠন রয়েছে, কিছু বা অন্য কোনওটির জন্য।
yfeldblum

28
ওহ, আমি এটি আনন্দদায়ক মনে করি। মানচিত্রের বাক্য গঠন হিসাবে, হ্যাঁ, আমরা যদি নতুন do {"কর", "একটি হরিণ"}, {"পুনরায়", "সোনালি সূর্য"} ... do করতে পারি এবং সংকলকটি এটি নির্ধারণ করতে পারি তবে তা দুর্দান্ত হবে একটি মানচিত্রের নির্মাণ, ঠিক যেমন নতুন [], 1, 2,3 an কোনও ইনট অ্যারে নির্মাণকে অনুমান করে। আমরা এই ধরণের বিষয় বিবেচনা করছি।
এরিক লিপার্ট

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

উত্তর:


147

এটির খুব কম ইন্টারপ রয়েছে। উদাহরণস্বরূপ, এই সি # - এফ # উদাহরণ বিবেচনা করুন

সি #:

public class Class1
{
    public static void Foo(Func<object, string> f)
    {
        Console.WriteLine(f.Method.GetParameters()[0].Name);
    }
}

এফ #:

Class1.Foo(fun yadda -> "hello")

ফলাফল:

"আরগ" মুদ্রিত ("ইয়াদদা" নয়)।

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


11
আপনি না। এই কৌশলটি কেবল অ-বহনযোগ্য। (যদি এটি অন্যভাবে উদাহরণ হিসাবে সহায়তা করে তবে, F # ওভারলোডিং পদ্ধতিগুলিতে কেবল সক্ষম হতে পারে যা কেবল রিটার্ন টাইপের ক্ষেত্রে পৃথক হয় (প্রকারের অনুক্রমটি এটি করতে পারে) This এটি সিএলআরে প্রকাশ করা যেতে পারে F তবে এফ # এটিকে অস্বীকার করে, কারণ বেশিরভাগ ক্ষেত্রে যদি আপনি এটি করেছেন, সেই API গুলি সি # থেকে কলযোগ্য হবে না)) যখন ইন্টারপ করার কথা আসে তখন সর্বদা 'প্রান্ত' বৈশিষ্ট্যে ট্রেড অফ থাকে আপনি কী কী লাভের বিপরীতে আপনি কীভাবে ইন্টারঅপ বাণিজ্য করেন সে সম্পর্কিত regarding
ব্রায়ান

32
কিছু না করার কারণ হিসাবে আমি অ আন্তঃঅবিযোগিতা পছন্দ করি না। আন্তঃব্যবহারযোগ্যতা যদি প্রয়োজন হয় তবে তা করুন, যদি না হয় তবে কেন এটি নিয়ে চিন্তা করবেন? এটি হ'ল ইয়াগনি আইএমএইচও।
জন Farrell

15
@jfar: ইন .NET CLR জমি ইনটেরোপিরাবিলিটি হিসাবে উত্পন্ন সমাহারগুলি একটি সম্পূর্ণ নতুন dimenssion আছে, কোন কম্পাইলার থেকে গ্রাস হতে অনুমিত হয় অন্যান্য ভাষা।
রিমাস রুসানু

25
আমি সম্মত হলাম যে আপনাকে সিএলএসের অনুগত হতে হবে না তবে আপনি যদি একটি লাইব্রেরি বা নিয়ন্ত্রণ লিখছেন (এবং এটি শুরু করা স্নিপেট গ্রিড থেকে এসেছে, হ্যাঁ?) অন্যথায়, আপনি কেবল সীমাবদ্ধ করছেন আপনার শ্রোতা / গ্রাহক বেস
JMarsch

4
হতে পারে এটি পরিবর্তনযোগ্য: ফানক <অবজেক্ট, স্ট্রিং> এক্সপ্রেশন << ফানক <অবজেক্ট, স্ট্রিং >> এবং আপনি যদি অভিব্যক্তিটির ডান দিকটি কেবল ধ্রুবক হিসাবে সীমাবদ্ধ করেন তবে এটির একটি বাস্তবায়ন থাকতে পারে: পাবলিক স্ট্যাটিক আইডোরিয়াল <স্ট্রিং, স্ট্রিং> হ্যাশ (প্যারামস এক্সপ্রেশন <ফানক <অবজেক্ট, স্ট্রিং >> [] হ্যাশ) {অভিধান <স্ট্রিং, স্ট্রিং> মানগুলি = নতুন অভিধান <স্ট্রিং, স্ট্রিং> (); ফরচ (হ্যাশ-এ ভের্ক) {মানগুলি [ফানক.প্যারামিটারস [0]। নাম] = (স্ট্রিং) ((কনস্ট্যান্ট এক্সপ্রেসন) ফানক.বডি) V মূল্য; } মূল্য ফেরত; }
ডেভিডফাউল

154

আমি দেখতে পেয়েছি যে নামের কারণে এতটা অদ্ভুত নয় , তবে ল্যাম্বডা অপ্রয়োজনীয় ; এটি একটি বেনামি ধরনের ব্যবহার করতে পারে এবং আরও নমনীয় হতে পারে:

.Attributes(new { style = "width:100%", @class="foo", blip=123 });

এই ASP.NET MVC (উদাহরণস্বরূপ) অনেক ব্যবহৃত একটি প্যাটার্ন, এবং হয়েছে অন্য ব্যবহারের (ক সতর্কীকরণ , নোট এছাড়াও Ayende চিন্তা যদি নাম একটি যাদু মান আহ্বানকারী-নির্দিষ্ট বদলে যায়)


4
এর মধ্যে ইন্টারপ ইস্যুও রয়েছে; সমস্ত ভাষাগুলি উড়ে যাওয়ার মতো একটি বেনামি প্রকার তৈরি করে না।
ব্রায়ান

5
আমি পছন্দ করি যে কেউ কীভাবে সত্যই প্রশ্নের উত্তর দেয় না, পরিবর্তে লোকেরা "এটি আরও ভাল" যুক্তি সরবরাহ করে। : p এটা কি গালি নেই নাকি?
স্যাম জাফরন

7
আমি এরিক এরিক লিপার্ট এর প্রতিক্রিয়া দেখতে আগ্রহী হবে। কারণ এটি ফ্রেম ওয়ার্ক কোডে । এবং এটি ঠিক ততটাই ভয়ঙ্কর।
ম্যাট হিনজে 11

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

2
@ আরনিস - কেন আরও নমনীয়: এটি উল্লিখিত প্যারামিটার নামের উপর নির্ভর করে না, যা কিছু ল্যাম্বদা বাস্তবায়ন (অন্যান্য ভাষা) নিয়ে সমস্যার কারণ হতে পারে (আমাকে উদ্ধৃতি দেবে না) - তবে আপনি সংজ্ঞায়িত বৈশিষ্ট্যযুক্ত নিয়মিত বস্তুও ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি HtmlAttributesপ্রত্যাশিত গুণাবলীর সাথে (বুদ্ধি জন্য) একটি বর্গ রাখতে পারেন এবং nullমান সহ কেবল তাদের উপেক্ষা করুন ...
মার্ক গ্র্যাভেল

137

কেবল আমার মতামতটি ছুঁড়ে ফেলতে চেয়েছিলেন (আমি এমভিসিকন্ট্রিবি গ্রিড উপাদানটির লেখক)।

এটি অবশ্যই ভাষার অপব্যবহার - এটি সম্পর্কে কোনও সন্দেহ নেই। তবে, আমি সত্যিই এটিকে স্বজ্ঞাত হিসাবে বিবেচনা করব না - আপনি যখন কোনও কলটি দেখেন তখন Attributes(style => "width:100%", @class => "foo")
আমার মনে হয় যে এটি কী চলছে তা খুব স্পষ্ট ((এটি অবশ্যই বেনামে ধরণের পদ্ধতির চেয়ে খারাপ নয়)। ইন্টেলিজেন্স দৃষ্টিকোণ থেকে আমি সম্মত হই যে এটি বেশ অস্বচ্ছ।

আগ্রহীদের জন্য, এমভিসিকন্ট্রিবিতে এর ব্যবহার সম্পর্কে কিছু পটভূমি তথ্য ...

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

যদি সি # এর অভিধানের অক্ষরগুলির জন্য কম ভার্বোস বাক্য গঠন থাকে তবে আমি গ্রিড উপাদানটিতে এই বাক্য গঠনটি অন্তর্ভুক্ত করে বিরক্ত করতাম না :)

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

এছাড়াও, কেউ 'প্রতিবিম্ব ওভারহেড' উল্লেখ করেছে এবং আমি কেবল এটি উল্লেখ করতে চেয়েছিলাম যে এই পদ্ধতির সাথে সত্যিকারের কোনও ওভারহেড নেই - কোনও রানটাইম প্রতিবিম্ব বা অভিব্যক্তি সংকলন জড়িত নেই (দেখুন http://blog.bittercoder.com / পারমিলিংক, গুইড ,206e64d1-29ae4362-874b-83f5b103727f.aspx )।


1
আমি এখানে আমার ব্লগে আরও উত্থাপিত কয়েকটি সমস্যা সমাধানের চেষ্টা করেছি: জেরেমিসকিনার.কম.2009
জেরেমি স্কিনার

4
এটি বেনামে থাকা বস্তুর চেয়ে ইন্টেলিসেন্সে কম অস্বচ্ছ নয়।
ব্র্যাড উইলসন

22
+1 উল্লেখ করার জন্য যে ইন্টারফেসটি al চ্ছিক এক্সটেনশন পদ্ধতির মাধ্যমে যুক্ত করা হয়েছে । নন সি # ব্যবহারকারী (এবং যে কেউ ভাষার অপব্যবহারের কারণে ক্ষুব্ধ হয়েছেন) কেবল এটি ব্যবহার করা থেকে বিরত থাকতে পারেন।
জার্ন শো-রোড

50

আমি পছন্দ করবো

Attributes.Add(string name, string value);

এটি অনেক বেশি স্পষ্ট এবং মানক এবং ল্যাম্বডাস ব্যবহার করে কিছুই অর্জন করা যায় না।


20
এটা যদিও? (প্রকৃত এইচটিএমএল উত্পন্ন) html.Attributes.Add("style", "width:100%");হিসাবে খুব সুন্দরভাবে পড়েন না style = "width:100%", যদিও style => "width:100%"ফলাফলটি এইচটিএমএল দেখতে এটির মতো দেখতে খুব কাছেই।
জেমি পেনি

6
তাদের সিনট্যাক্সগুলি .Atributes (id => 'foo', @class => 'বার', স্টাইল => 'প্রস্থ: 100%') এর মতো কৌশলগুলির জন্য অনুমতি দেয়। ফাংশনের স্বাক্ষরটি আর্গুমেন্টের পরিবর্তনশীল সংখ্যার জন্য প্যারাম সিনট্যাক্স ব্যবহার করে: বৈশিষ্ট্য (প্যারাম ফানক <অবজেক্ট, অবজেক্ট> [] আরগস)। এটি খুব শক্তিশালী, তবে ডাব্লুটিএফ এটি বুঝতে আমার বেশ সময় লাগল।
রিমাস রুসানু

27
@ জ্যামি: সি # কোডটিকে এইচটিএমএল কোডের মতো দেখতে চেষ্টা করা ডিজাইন বিশদকরণের জন্য খারাপ কারণ হতে পারে। সম্পূর্ণ ভিন্ন উদ্দেশ্যে তারা সম্পূর্ণ আলাদা ভাষা এবং এগুলির মতো দেখতে হবে না।
গুফা

17
একটি অনামী অবজেক্টটি সম্ভবত "সৌন্দর্য" ত্যাগ না করে ব্যবহার করা যেতে পারে? .অ্যাট্রিবিউটস (নতুন {আইডি = "ফু", @ ক্লাস = "বার", স্টাইল = "প্রস্থ: 100%"}) ??
ফানকা

10
@ গুফা কেন এটি ডিজাইনের সিদ্ধান্তের জন্য খারাপ কারণ হবে? তাদের দেখতে কেন একই রকম হবে না? এই যুক্তি দ্বারা তাদের ইচ্ছাকৃতভাবে আলাদা দেখতে হবে? আমি আপনার ভুল বলছি না, আমি কেবল বলছি আপনি নিজের বিষয়টিকে আরও পরিপূর্ণভাবে ব্যাখ্যা করতে চাইতে পারেন।
সামান্থা ব্রানহাম

45

রেল ল্যান্ডে আপনাকে স্বাগতম :)

যতক্ষণ না আপনি জানেন যে এর মধ্যে আসলেই কোনও ভুল নেই। (যখন এই ধরণের জিনিসটি ভালভাবে নথিভুক্ত করা হয়নি যে সমস্যা আছে)।

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

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


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

5
আমি বুঝতে পারি না কেন এটি আমার কাছে অদ্ভুত নয় এবং তারপরে আমি রেলের কথা স্মরণ করি। : ডি
অ্যালেন

43

এটা ভয়াবহ একাধিক স্তরে । এবং না, এটি রুবির মতো কিছু নয়। এটি সি # এবং। নেট এর অপব্যবহার।

কীভাবে এটি আরও সোজাভাবে এগিয়ে নেওয়া যায় সে সম্পর্কে অনেক পরামর্শ দেওয়া হয়েছে: টিপলস, বেনামে টাইপ করা, একটি সাবলীল ইন্টারফেস এবং আরও অনেক কিছু।

এটি এতটা খারাপ করে তোলে যে এটি তার নিজের ভালোর জন্য অভিনব হওয়ার একমাত্র উপায়:

  • আপনি যখন ভিবি থেকে এই কল করতে হবে তখন কি হবে?

    .Attributes(Function(style) "width:100%")

  • এটি সম্পূর্ণরূপে স্বজ্ঞাত, আন্তঃজ্ঞান পাল্টা কীভাবে স্টাফগুলিতে পাস করবে তা নির্ধারণের জন্য সামান্য সহায়তা সরবরাহ করবে।

  • এটি অহেতুক অদক্ষ।

  • কীভাবে এটি বজায় রাখা যায় সে সম্পর্কে কারও কোনও ধারণা নেই।

  • বৈশিষ্ট্যগুলিতে যুক্তির ধরণটি কী ধরণের, এটি এটি Func<object,string> কি? কীভাবে সেই অভিপ্রায় প্রকাশ পাচ্ছে। আপনার ইন্টিলিজেন্স ডকুমেন্টেশন কী বলতে চলেছে, "দয়া করে সমস্ত বস্তুর মূল্যবোধ উপেক্ষা করুন"

আমি মনে করি আপনি বিদ্রোহের এই অনুভূতিগুলি সম্পূর্ণরূপে ন্যায়সঙ্গত করেছেন।


4
আমি বলব - এটি সম্পূর্ণ স্বজ্ঞাত। :)
আরনিস ল্যাপসা

4
তুই বলিস তা রুবির মতো কিছু নয়। তবে হ্যাশ টেবিলের কী এবং মানগুলি নির্দিষ্ট করে দেওয়ার জন্য এটি রুবির সিনট্যাক্সের মতো অনেকটা ভয়ঙ্কর হেক।
চার্লি ফুল

3
কোড যে আলফা-রূপান্তর অধীনে বিরতি! Yey!
ফিল

3
@ চার্লি, সিন্ট্যাক্টিকালি এটি দেখতে একই রকম, শব্দার্থগতভাবে এটি অন্যরকম।
স্যাম জাফরান

39

আমি "সিনট্যাক্স ব্রিলিয়েন্স" শিবিরে আছি, তারা যদি এটিকে স্পষ্ট করে দলিল করে, এবং এটিকে দুর্দান্ত দেখায়, ইমো নিয়ে প্রায় কোনও সমস্যা নেই!


10
আমেন ভাই। আমেন (মন্তব্যের জন্য ন্যূনতম দৈর্ঘ্যের সাথে মিলিত হওয়ার জন্য ২ য় আমেনের প্রয়োজন :)
চার্লি ফুল

আপনার মন্তব্যটি একাকী প্রয়োজনের চেয়ে বেশি ছিল। তবে, আপনি একবার শুধু আমিন করতে পারবেন না এবং তারপরে আপনার মন্তব্যে
লিখতে

37

দুজনেই। এটি ল্যাম্বডা এক্সপ্রেশন এবং সিনট্যাক্স উজ্জ্বলতার আপত্তিজনক ।


16
সুতরাং এটি ল্যাম্বডা এক্সপ্রেশনগুলির একটি উজ্জ্বল সিনট্যাকটিকাল অপব্যবহার? আমি মনে করি আমি একমত হয়েছি :)
শেঠ পেট্রি-জনসন

21

এই ধরণের ব্যবহারটি আমি খুব কমই করতে পারি। আমি মনে করি এটি "অনুপযুক্ত" :)

এটি ব্যবহারের সাধারণ উপায় নয়, এটি সাধারণ সম্মেলনের সাথে অসঙ্গতিপূর্ণ। এই ধরণের সিনট্যাক্সের অবশ্যই উপকারিতা এবং মতামত রয়েছে:

কনস

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

পেশাদাররা

  • বিকাশকারীকে এই সিনট্যাক্সের সাথে সামঞ্জস্য করার পরে এটি আরও পঠনযোগ্য।

নীচের লাইন - পাবলিক এপিআই ডিজাইনে আমি আরও স্পষ্ট উপায় বেছে নিতে পারতাম।


2
@ ইলিশা - আপনার পেশাদাররা এবং বিপরীতগুলি বিপরীত। কমপক্ষে আমি আশা করি আপনি বলছেন না যে কোনও প্রোতে কোড রয়েছে "স্বজ্ঞাত নয়"। ;-)
মেট্রো স্মুরফ

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

19

না, এটি অবশ্যই সাধারণ অভ্যাস নয়। এটি পাল্টা স্বজ্ঞাত, এটি কী করে তা বের করার জন্য কোডের দিকে তাকানোর কোনও উপায় নেই। এটি কীভাবে ব্যবহার করা হয় তা বুঝতে আপনাকে এটি ব্যবহার করতে হবে।

প্রতিনিধিদের একটি অ্যারে ব্যবহার করে অ্যাট্রিবিউট সরবরাহের পরিবর্তে শিকল পদ্ধতিগুলি আরও পরিষ্কার হবে এবং আরও ভাল সম্পাদন করবে:

.Attribute("style", "width:100%;").Attribute("class", "test")

যদিও এটি টাইপ করতে কিছুটা বেশি তবে এটি স্পষ্ট এবং স্বজ্ঞাত।


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

4
@ স্টুয়ার্ট: না, আপনি ঠিক জানতেন না, আপনি ব্যবহৃত মূল্যবোধের ভিত্তিতে কেবল অনুমান করছেন। যে কেউ অনুমান করতে পারে তবে অনুমান করা কোড বোঝার ভাল উপায় নয়।
গুফা

11
আমি অনুমান করছি ব্যবহারগুলি .Attribute("style", "width:100%")আমাকে দেয় style="width:100%"তবে আমি জানি যে এটি আমাকে দিতে পারে foooooo। আমি পার্থক্য দেখছি না।
সামান্থা ব্রানহাম

5
"ব্যবহৃত মানগুলির উপর ভিত্তি করে অনুমান করা" কোড দেখার সময় আপনি যা করেন তা সর্বদা। আপনি যদি স্ট্রিম.ক্লোজ () তে কোনও কল পান তবে আপনি ধরে নিবেন এটি একটি স্ট্রিম বন্ধ করে দিয়েছে, তবুও এটি কিছু আলাদাভাবে করতে পারে।
ওয়াউটার লাইভেন্স 14

1
@ বাউটার: কোড পড়ার সময় আপনি যদি সর্বদা অনুমান করে থাকেন তবে আপনার অবশ্যই কোড পড়তে খুব অসুবিধা হতে হবে ... যদি "ক্লোজ" নামের কোনও পদ্ধতিতে আমি কল দেখতে পাই তবে আমি সংগ্রহ করতে পারি যে শ্রেণীর লেখক নামকরণ কনভেনশন সম্পর্কে জানেন না doesn't , সুতরাং পদ্ধতিটি কী করে তা মঞ্জুর করার জন্য আমি মোটেই কিছু নিতে দ্বিধা বোধ করব।
গুফা 15

17

আমি কি একটি বাক্যাংশ মুদ্রার জন্য এটি ব্যবহার করতে পারি?

ম্যাজিক ল্যাম্বদা (এন): একটি ল্যাম্বডা ফাংশনটি কেবল ম্যাজিক স্ট্রিং প্রতিস্থাপনের উদ্দেশ্যে ব্যবহৃত হয়।


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


16

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

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

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

সম্পাদনা: আমি বলেছিলাম "সফটওয়্যারটিকে আরও রক্ষণাবেক্ষণযোগ্য এবং আরও নির্ভুল করে তোলার মূল চাবিকাঠি", এটি এক উন্মত্ততাপূর্ণ মূর্খতা un আমি এটিকে "চাবি" তে পরিবর্তন করেছি।


12

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


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

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

7

এটি একটি আকর্ষণীয় পদ্ধতির। আপনি যদি অভিব্যক্তির ডান হাতটিকে কেবল ধ্রুবক হিসাবে সীমাবদ্ধ করেন তবে আপনি ব্যবহার করে প্রয়োগ করতে পারবেন

Expression<Func<object, string>>

যা আমি মনে করি ডেলিগেটের পরিবর্তে আপনি যা চান তা হ'ল (আপনি উভয় পক্ষের নাম পেতে ল্যাম্বডা ব্যবহার করছেন) নীচে নিষ্পাপ বাস্তবায়ন দেখুন:

public static IDictionary<string, string> Hash(params Expression<Func<object, string>>[] hash) {
    Dictionary<string, string> values = new Dictionary<string,string>();
    foreach (var func in hash) {
        values[func.Parameters[0].Name] = ((ConstantExpression)func.Body).Value.ToString();
    }
    return values;
}

এটি এমনকি থ্রেডের আগে উল্লিখিত ক্রস ল্যাঙ্গুয়েজ ইন্টারপ উদ্বেগের সমাধান করতে পারে।


6

কোডটি খুব চালাক, তবে এটি সম্ভবত সমাধান করে এমন আরও সমস্যা তৈরি করে।

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

একটি আরও ভাল সমাধান হ'ল সংকলন সময়ে পরীক্ষা করা যেতে পারে এমন একটি ডেটা সদস্য রয়েছে। সুতরাং এর পরিবর্তে:

.Attributes(style => "width:100%");

একটি স্টাইল বৈশিষ্ট্যযুক্ত কোডটি সংকলক দ্বারা পরীক্ষা করা যেতে পারে:

.Attributes.Style = "width:100%";

অথবা এমনকি:

.Attributes.Style.Width.Percent = 100;

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


3
আমি সংকলন-সময় যাচাইয়ের প্রশংসা করি, তবে আমি মনে করি এটি মতামত নিয়ে আসে। হতে পারে নতুন বৈশিষ্ট্যগুলির মতো ({স্টাইল: "প্রস্থ: 100%" something আরও বেশি লোককে জিততে পারে, যেহেতু এটি আরও পরিশ্রুত। তবুও, এইচটিএমএল দ্বারা অনুমতিপ্রাপ্ত সমস্ত কিছুই কার্যকর করা একটি বিশাল কাজ এবং আমি কেবল স্ট্রিং / ল্যাম্বডাস / বেনাম ক্লাস ব্যবহারের জন্য কাউকে দোষ দিতে পারি না।
সামান্থা ব্রানহাম

5

প্রকৃতপক্ষে এটি রুবি এর মতো মনে হয় =), কমপক্ষে আমার জন্য পরবর্তী গতিশীল "অনুসন্ধান" এর জন্য স্ট্যাটিক রিসোর্সের ব্যবহার এপিআই ডিজাইন বিবেচনার জন্য উপযুক্ত নয়, আশা করি এই চতুর কৌশলটি এপিআইতে optionচ্ছিক।

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

আশাকরি এটা সাহায্য করবে


4

আমার মতে এটি ল্যাম্বডাসের অপব্যবহার।

সিনট্যাক্স ব্রিলিয়েন্স হিসাবে আমি style=>"width:100%"প্লেইন বিভ্রান্তি মনে করি। বিশেষত =>পরিবর্তে কারণ=


4

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

এছাড়াও অভিপ্রায়টি এখানে খুব স্পষ্ট। এটি বুঝতে খুব সহজ যে এর .Attribute( book => "something")ফলাফল হবে book="something"এবং .Attribute( log => "something")ফলাফল হবেlog="something"

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


4
ক্লাস কন্ট্রোলারের নামকরণ যদি আপনিও নিয়ামকের কাছ থেকে উত্তরাধিকারী না হন তবে স্কোয়াট করবেন না ...
জর্ডান ওয়ালওয়ার্ক

3

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


1

আমি মনে করি এটি "ম্যাজিক স্ট্রিং" এর চেয়ে ভাল নয়। আমি এর জন্য বেনামে প্রকারের খুব বেশি ভক্ত নই। এটির জন্য আরও ভাল এবং দৃ strongly়ভাবে টাইপ করা পদ্ধতির প্রয়োজন।

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