420

나는MvcContrib그리드 구성 요소와 나는 매료되었지만 동시에 반발했다.그리드 구문:

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

위 구문은 생성 된 HTML의 style 속성을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))그것은 같은 것을 의미한다.. 하지만 MvcContrib Grid 문법을 사용하면 갑자기 내가 변수를 선택하는 이름을 기반으로 적극적으로 외모를 만들고 코드를 구분할 수 있습니다.

C #3.5 / 4.0 커뮤니티와 람다 표현을 좋아하는 사람들도 이와 같은 일반적인 관행을 사용하고 있습니까? 아니면 내가 걱정해서는 안 될 가짜 트릭 독점자입니까?


  • 구문을 파싱하는 것보다는 코드의 의도를 살펴 보려는 한 분명합니다. 좋은 코드를 읽는다면 어쨌든해야 할 일입니다. 문법은 의도를위한 수단 일 뿐이며, 나는 이것이 의도적 인 코드를 드러내는 것이라고 주장 할 것이다. - Jamie Penney
  • 나는 Anders (그리고 나머지 디자인 팀)에게 그들이 생각한 것을 요청했다. 결과가 가족 친화적 인 신문에 인쇄되지 않을 것이라고 가정 해 보겠습니다. - Eric Lippert
  • C #은 현재지도에 대한 깨끗하고 가벼운 구문, 특히 함수에 전달 된지도가 누락되었습니다. 다양한 동적 언어 (Ruby, Python, JavaScript, ColdFusion 9)는이를 위해 깨끗하고 가벼운 구문을 사용합니다. - yfeldblum
  • 오, 기분 좋게 보입니다. 지도의 구문에 관해서는, 예, 새로운 {{ "Do", "A deer" }, { "Re", "golden sun"} ...} 그리고 new [] {1, 2,3}가 int 배열의 구성을 추측하는 것처럼 컴파일러가지도의 구성을 추측하도록합니다. 우리는 이런 종류의 것들을 고려하고 있습니다. - Eric Lippert
  • Eric Lippert, 나는 당신을 크게 존중하지만, 나는 당신과 그룹 (FREAKIN &TREMENDOUSLY을 존중하는 Anders를 포함하여)이 이것을 너무 가혹하게 공격하고 있다고 생각합니다. C #에는 맵에 대한 구문이 부족하고 Ruby와 같은 다른 언어에는 위대한 구문이 있습니다. 이 사람은 그가 원하는 구문을 얻을 수있는 방법을 발견했습니다. 나는 그것을 표현할 비슷한 방법이 있음을 당신에게 인정합니다.거의적은 단점을 가진 그의 구문만큼 표현력이있다. 그러나 그의 구문과 그가 그것을 얻기 위해 열심히 노력한 사실은 분명히 언어 향상의 필요성을 보여줍니다. 과거 실적은 사람들이 큰 성과를 거둘 수 있음을 나타냅니다. - Charlie Flowers

21 답변


146

이것은 상호 운용성이 낮습니다. 예를 들어,이 C #- F #예제를 생각해보십시오.

기음#:

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

에프#:

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

결과:

"arg"가 인쇄됩니다 ( "yadda"가 아님).

결과적으로 라이브러리 설계자는 이러한 종류의 '악용 사례'를 피하거나 적어도 .Net 언어에서 좋은 interop을 원할 경우 '표준'오버로드 (예 : 추가 매개 변수로 문자열 이름을 사용)를 제공해야합니다.


  • 너는 몰라. 이 전략은 단순히 휴대 할 수 없습니다. (예를 들어, 다른 방법으로 F #을 사용하면 반환 형식 만 다른 메서드를 오버로드 할 수 있습니다 (형식 유추에서 가능) .CLR에서 표현할 수 있지만 F #에서는이를 허용하지 않습니다. C #에서 호출 할 수없는 API가 있습니다.) interop에 관해서는 언제나 ' ' 당신이 얻는 이익과 당신이 교환하는 상호 운용성에 관한 특징. - Brian
  • 무언가를하지 않을 이유가 아닌 상호 운용성을 좋아하지 않습니다. 상호 운용성이 요구 사항이라면 그렇게하고 그렇지 않으면 왜 그렇게 걱정해야합니까? 이것은 YAGNI IMHO입니다. - jfar
  • @jfar : .NET CLR의 토지 상호 운용성은 완전히 새로운 차원을가집니다.어떤컴파일러는다른언어. - Remus Rusanu
  • CLS와 호환 될 필요는 없다고 동의하지만 라이브러리 나 컨트롤을 작성하는 경우에는 좋은 생각 인 것 같습니다. 시작하는 스 니펫은 그리드에서 가져옵니다. 그렇다면 그렇지 않습니다. 잠재 고객 / 고객 기반을 제한하는 것만으로 - JMarsch
  • 아마도 : Func < object, string > to Expression < < Func < object &string > > 표현식의 오른쪽을 const로 제한하면 다음과 같은 구현을 할 수 있습니다. public static IDictionary < string, string > 해시 (< string, > < Func < object &string; > 값 = 새로운 사전 < 문자열, 문자열 > (); foreach (해시의 var 함수) {값 [func.Parameters [0] .Name] = (문자열) ((ConstantExpression) func.Body). 값; } 반환 값; } - davidfowl

153

그 이상한 이유는이름, 왜냐하면람다는 불필요하다.; 익명 유형을 사용할 수 있고보다 유연하게 사용할 수 있습니다.

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

이것은 ASP.NET MVC의 많은 부분에서 사용되는 패턴이며 (예를 들어)다른 용도(에이경고, 메모아옌데의 생각이름이 호출자 고유가 아닌 마술 값인 경우)


  • 이것은 또한 interop 문제가 있습니다. 모든 언어가 그처럼 익명의 타입을 만드는 것을 지원하는 것은 아닙니다. - Brian
  • 아무도 정말로 그 질문에 대답하지 못하는 방법을 좋아합니다. 대신에 사람들은 "이게 낫습니다"라고 대답합니다. 논의. : p 학대입니까? - Sam Saffron
  • Eric Lippert의 반응에 관심이 있습니다. 때문에FRAMEWORK 코드에 있습니다.. 그리고 그것은 끔찍한 것과 마찬가지입니다. - Matt Hinze
  • 문제는 가독성이라고 생각하지 않습니다.코드가 작성되었습니다. 나는 진짜 문제는 코드의 학습 능력이라고 생각한다. 당신의 intellisense가 말할 때 당신은 어떻게 생각할 것입니까?.Attributes (객체 obj)? 메소드에 전달할 항목을 알지 못했기 때문에 아무도 읽고 싶지 않은 설명서를 읽어야합니다. 이것이 실제로 질문의 예보다 더 좋다고 생각하지 않습니다. - NotDan
  • @Arnis - 더 유연한 이유는 묵시적인 매개 변수 이름에 의존하지 않습니다.(인용하지 않음) 일부 람다 구현 (다른 언어) 문제가 발생하지만 정의 된 속성이있는 일반 객체를 사용할 수도 있습니다. 예를 들어,HtmlAttributes클래스를 예상 속성 (IntelliSense 용)으로 채우고null값 ... - Marc Gravell

137

그냥 내 의견을 던지고 싶었 (나는 MvcContrib 그리드 구성 요소의 저자).

이것은 분명히 언어 학대입니다. 의심의 여지가 없습니다. 그러나, 나는 그것을 직관적이라고 생각하지 않을 것입니다.Attributes(style => "width:100%", @class => "foo")

무슨 일이 벌어 졌는지는 꽤 분명하다고 생각합니다. 익명의 접근 방식보다 더 나쁜 것은 아닙니다. 인텔리 센스 관점에서, 나는 그것이 꽤 불투명하다는 것에 동의한다.

관심있는 분들을 위해 MvcContrib에서의 사용에 대한 배경 정보를 ...

개인적 취향대로 격자에 추가했습니다. 익명 형식을 사전으로 사용하는 것을 좋아하지 않습니다. "개체"를 사용하는 매개 변수는 params Func []와 같은 불투명도를 가지며 사전 컬렉션 초기화 프로그램은 다음과 같습니다. ( "style", "display : none") 속성 ( "class", "foo") 등)에 대한 여러 호출을 함께 연결해야하는 등 세부적인 유창한 인터페이스의 팬이 아닙니다.

C #에 사전 리터럴에 대한 자세한 구문이 없으면 그리드 구성 요소에 다음 구문을 포함하여 귀찮게하지 않았을 것입니다. :)

또한 MvcContrib에서이 옵션을 사용하는 것이 완전히 선택 사항임을 지적하고자합니다.이 메서드는 IDictionary를 대신 사용하는 오버로드를 감싸는 확장 메서드입니다. 이와 같은 방법을 제공하면 다른 언어와의 interop와 같이보다 일반적인 '접근법'을 지원해야한다는 것이 중요하다고 생각합니다.

또한 누군가가 '반사 오버 헤드'에 대해 언급했으며이 접근법으로 인해 오버 헤드가별로 없다는 점을 지적하고자했습니다. 런타임 반영이나 표현 컴파일이 필요하지 않습니다.http://blog.bittercoder.com/PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx).



48

내가 선호하는

Attributes.Add(string name, string value);

훨씬 더 명시 적이며 표준이며 lambdas를 사용하여 얻은 결과는 없습니다.


  • 그래도 그래?html.Attributes.Add("style", "width:100%");다음과 같이 멋지게 읽지는 않습니다.style = "width:100%"(생성 된 실제 html), 반면style => "width:100%"결과 HTML에서와 매우 비슷합니다. - Jamie Penney
  • 그들의 구문은 .Attributes (ID = > ' foo ' @ class = > &bar; #style = > &width; 100 % ' 함수 시그니처는 변수 개수의 args에 대해 params 구문을 사용합니다 : Attributes (params Func < object, object > [] args). 그것은 매우 강력하지만, 그것은 나를 데려 갔다.꽤 오래그것을 이해하기 위해서입니다. - Remus Rusanu
  • @ Jamie : C #코드를 HTML 코드처럼 보이게 만들려고하면 디자인 선택에 나쁜 이유가됩니다. 그들은 완전히 다른 목적을위한 완전히 다른 언어이며, 똑같이 보일 수 없습니다. - Guffa
  • 익명의 객체는 "아름다움"을 희생하지 않고도 사용되었을 수 있습니다. (new {id = "foo", @class = "bar", style = "width : 100 %"}) ?? - Funka
  • @ Guffa 왜 디자인 결정에 나쁜 이유가 될까요? 왜 그들은 똑같이 보이지 않아야합니까? 그 이유로 그들은의도적으로다르게 보이다? 틀린 말은하지 않습니다. 단지 포인트를 더 자세히 설명하고 싶을 수도 있습니다. - Samantha Branham

46

레일 랜드에 오신 것을 환영합니다 :)

당신이 무슨 일이 일어나고 있는지를 아는 한 실제로 아무 문제가 없습니다. (이런 종류의 문제가 잘 문서화되어 있지 않은 경우).

Rails 프레임 워크 전체는 컨벤션 오버 규칙에 기반을두고 있습니다. 이름을 붙이면 어떤 방식 으로든 그들이 사용하고있는 컨벤션에 들어갈 수 있으며 무료로 많은 기능을 사용할 수 있습니다. 명명 규칙에 따라 더 빨리 갈 수 있습니다. 모든 것이 훌륭하게 작동합니다.

이와 같은 트릭을 본 다른 곳은 Moq의 메소드 호출 어설 션입니다. 당신은 람다를 전달하지만 람다는 결코 실행되지 않습니다. 메서드 호출이 발생했는지 확인하기 위해 표현식을 사용하고 그렇지 않은 경우 예외를 throw합니다.


  • 나는 조금 주저했지만, 나는 동의한다. 리플렉션 오버 헤드 외에도 Add ()와 같이 문자열을 사용하는 것과 람다 매개 변수 이름을 사용하는 것 사이에는 큰 차이가 없습니다. 적어도 내가 생각할 수있는. "sytle"을 입력하면됩니다. 두 가지 방법을 모두 눈치 채지 않고 - Samantha Branham
  • 왜 이것이 이상하지 않은지 알 수 없었지만 레일스를 기억했습니다. :디 - Allyn

42

이것은끔찍한한 단계 이상. 그리고 아니, 이건 루비만한 건 없어요. 그것은 C #과 .Net의 남용입니다.

튜플, 익명의 타입, 유창한 인터페이스 등,보다 직선적 인 방법으로 이것을하는 방법에 대한 많은 제안이있었습니다.

그것을 그렇게 나쁜 것으로 만드는 것은 그것의 자신의 이익을 공상하는 그것의 정당한 길이다 :

  • VB에서 호출해야 할 때 어떻게됩니까?

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

  • 그것의 완전 직관적 인 intellisense는 물건을 전달하는 방법을 알아내는 데 도움이되지 않습니다.

  • 불필요하게 비효율적이다.

  • 아무도 그것을 유지하는 방법을 전혀 모른다.

  • 속성에 들어가는 인수의 유형은 무엇입니까?Func<object,string>? 그 의도는 어떻게 드러나는가? 귀하의 인텔리 센스 문서는 "개체의 모든 가치를 무시하십시오"라고 말할 것입니까?

나는 당신이 그 기분을 상하게하는 것이 정당하다고 생각합니다.


  • 나는 완전히 직관적이라고 말하고 싶다. :) - Arnis Lapsa
  • 당신은 루비와 같지 않다고 말합니다. 그러나 해시 테이블의 키와 값을 지정하는 Ruby 구문과 매우 흡사합니다. - Charlie Flowers
  • 알파 변환으로 깨지는 코드! 이봐! - Phil
  • @Charlie, 구문 론적으로는 유사 해 보입니다. 의미 상으로는 다릅니다. - Sam Saffron

40

나는 "문법의 광휘"캠프에 있는데, 명확하게 문서화한다면,이 괴물처럼 보입니다. 거의 문제 없습니다.


  • 아멘, 형제. 아멘 (아멘 2 분이 의견을 기다리는 데 필요한 길이 :) - Charlie Flowers
  • 귀하의 의견만으로는 필요한 것 이상이었습니다. 그런 다음 한 번 아멘을 한 다음 댓글에 답장 할 수 있습니다. D - Sleeper Smith

37

둘 다. 람다 식의 학대구문 광휘.


  • 그래서 그것은 람다 표현의 훌륭한 문법적 남용입니까? 나는 내가 동의한다라고 생각한다 :) - Seth Petry-Johnson

21

나는 이런 종류의 사용법을 거의 접하지 못했다. 나는 그것이 "부적절한 것"이라고 생각한다. :)

이것은 일반적인 사용 방법이 아니며, 일반 협약과 일치하지 않습니다. 이런 종류의 구문에는 장단점이 있습니다.

단점

  • 코드는 직관적이지 않습니다 (일반적인 규칙은 다릅니다).
  • 그것은 깨지기 쉬운 경향이 있습니다 (매개 변수의 이름이 기능을 해치게됩니다).
  • 테스트하기가 조금 더 어렵습니다 (API를 위조하려면 테스트에서 리플렉션을 사용해야합니다).
  • 표현식이 집중적으로 사용된다면 매개 변수를 분석 할 필요가 있기 때문에 표현의 속도가 느려질 것입니다 (반사 비용)

찬성

  • 개발자가이 구문에 맞게 조정하면 더 읽기 쉽습니다.

결론- 공용 API 디자인에서 나는 더 명확한 방법을 선택했을 것이다.


  • @Elisha - 찬성과 반대가 반대입니다. 프로가 "직관적이지 않은"코드를 사용하고 있다고 말하지 않기를 바랍니다. ;-) - Metro Smurf
  • 이 특별한 경우 - 람다 매개 변수 이름과 문자열 매개 변수는 모두 약합니다. 어쨌든 xml에 대해 확신 할 수 없기 때문에 동적 인 xml 구문 분석을 사용하는 것이 좋습니다. - Arnis Lapsa

18

아니, 확실히 일반적인 관행은 아닙니다. 반 직관적입니다. 코드가 무엇인지 알아낼 수있는 방법이 없습니다. 어떻게 사용했는지 이해하는 데 익숙해야합니다.

대리자 배열을 사용하여 특성을 제공하는 대신 체인 방법이 더 명확 해지고 성능이 향상됩니다.

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

입력하는 방법이 조금 더 있지만 분명하고 직관적입니다.


  • 정말? 나는 그 코드 스 니펫이 내가 그것을 보았을 때 의도했던 것을 정확히 알고 있었다. 매우 엄격하지 않으면 그다지 둔하지 않습니다. 문자열 연결에 대한 오버로드에 대해 동일한 인수를 제공 할 수 있으며 항상 대신 Concat () 메서드를 사용해야합니다. - Samantha Branham
  • @ 스튜어트 : 아니요, 정확히 알지 못했지만 사용 된 값을 기반으로 추측 한 것입니다. 누구나 추측 할 수 있지만 추측은 코드를 이해하는 좋은 방법이 아닙니다. - Guffa
  • 사용을 추측하고 있습니다..Attribute("style", "width:100%")나에게 준다.style="width:100%",하지만 내가 아는 모든 것을 위해 그것은 나에게 줄 수있다.foooooo. 차이가 보이지 않습니다. - Samantha Branham
  • "사용 된 값에 기초한 추측" 코드를 볼 때 항상 당신이하는 일입니다. stream.close ()를 호출하면 스트림을 닫는 것으로 가정하지만 완전히 다른 것을 수행 할 수도 있습니다. - Wouter Lievens
  • @Wouter : 코드를 읽을 때 항상 추측하고 있다면 코드를 읽는 데 큰 어려움이 있어야합니다 ... "close"라는 메서드에 대한 호출이 표시되면 클래스 작성자가 명명 규칙을 알지 못한다는 것을 알 수 있으므로이 메소드가 수행하는 작업에 대해서는 아무 것도 받아들이지 않는 것이 매우 주저합니다. - Guffa

17

다음과 같은 점이 잘못되었습니다.

html.Attributes["style"] = "width:100%";



17

"horridness"에 대한이 모든 호언 장담은 오랜 시간 동안 C #의 사람들이 과민 반응을 겪고 있다는 것을 의미합니다 (그리고 저는 오랫동안 C #프로그래머 였고 여전히 언어에 대한 열렬한 팬이었습니다). 이 구문에 대해서는 끔찍한 것이 없습니다. 구문을 좀 더 표현하려고하는 것일뿐입니다. 구문에 구문에 "잡음"이 적 으면 적을수록 프로그래머는 더 쉽게 이해할 수 있습니다. 한 줄의 코드에서 노이즈를 줄이면 조금은 도움이되지만 점점 더 많은 코드에 걸쳐 올라 가게되면 상당한 도움이됩니다.

이것은 DSL이주는 것과 동일한 이익을 위해 노력하려는 저자의 시도입니다. 코드가 당신이 말하고자하는 것처럼 보이면, 당신은 마법의 장소에 도달했습니다. interop에 대해 이것이 좋은지 또는 "복잡성"비용의 일부를 정당화하기위한 익명 메소드보다 더 좋은지 여부에 대해 토론 할 수 있습니다. 공정하게 ... 너무 프로젝트에서 이런 종류의 문법을 사용할지 여부를 결정해야합니다. 그러나 여전히 ... 프로그래머가 영리한 시도를하는 것입니다. 하루가 끝날 무렵, 우리 모두는 (실현 여부에 관계없이) 시도하고 있습니다. 우리가하려고하는 모든 일은 다음과 같습니다. "컴퓨터로 하여금 우리가 원하는 것을 생각하는 방법에 가능한 한 가깝게 언어로하고 싶다고 말하십시오."

우리가 내부적으로 생각하는 것과 동일한 방식으로 컴퓨터에 대한 지침을 표현하는 것에 더 가까워지는 것은 소프트웨어를보다 정비 가능하고 더 정확하게 만드는 열쇠입니다.

편집 : 나는 unicorniness의 미친 듯이 순진 과장된 비트입니다 "더 maintainable하고 정확한 소프트웨어를 만드는 열쇠"라고했다. 나는 그것을 "열쇠"로 바꿨다.


16

문구 동전에 이걸 사용할 수 있습니까?

magic lambda (n) : 마술 끈을 대체 할 목적으로 만 사용되는 람다 함수.


  • 예 ... 재밌 네요. 어쩌면 컴파일시의 안전성이 없다는면에서이 사용법이 컴파일 타임 오류 대신 런타임을 유발할 수있는 곳이 어디인가? - Maslow

12

이것은 표현 트리의 이점 중 하나입니다. 추가 정보를 얻기 위해 코드 자체를 검사 할 수 있습니다. 그것이 어떻게.Where(e => e.Name == "Jamie")동일한 SQL Where 절로 변환 할 수 있습니다. 이것은 표현의 나무를 영리하게 사용하는 것입니다.하지만 이것보다 더 나아지지 않기를 희망합니다. 더 복잡한 것은 대체하려는 코드보다 어려울 수 있으므로 자체 제한이 될 것으로 판단됩니다.


  • LINQ에는 유효한 포인트가 있지만 광고에서의 진실성이 있습니다. LINQ에는 TableAttribute 및 ColumnAttribute와 같은 속성 집합이 포함되어있어보다 합법적입니다. 또한 linq 매핑은 매개 변수 이름보다 더 안정적인 클래스 이름과 속성 이름을 찾습니다. - Remus Rusanu
  • 나는 너와 거기에 동의한다. Eric Lippert / Anders Helsberg / 등이이 문제에 관해 언급 한 내용을 읽은 후 약간 이에 대한 입장을 바 꾸었습니다. 여전히 도움이되기 때문에이 답변을 남겨 두어야합니다. 가치있는 점은 HTML로 작업하는이 스타일이 좋다고 생각하지만 언어와 맞지 않습니다. - Jamie Penney

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

코드는 매우 똑똑하지만 잠재적으로 더 많은 문제를 일으 킵니다.

앞에서 언급했듯이 매개 변수 이름 (스타일)과 HTML 속성 사이에는 불명확 한 종속성이 있습니다. 컴파일 시간 검사가 수행되지 않습니다. 매개 변수 이름을 잘못 입력하면 페이지에 런타임 오류 메시지가 표시되지 않지만 논리 오류 (오류는 발생하지 않지만 잘못된 동작)는 찾기가 훨씬 어려워집니다.

더 나은 솔루션은 컴파일 할 때 확인할 수있는 데이터 멤버를 갖는 것입니다. 그래서 이것 대신 :

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

Style 속성이있는 코드는 컴파일러에서 확인할 수 있습니다.

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

또는:

.Attributes.Style.Width.Percent = 100;

코드 저작자가 더 많은 노력을 기울 였지만,이 접근법은 C #의 강력한 유형 검사 기능을 활용하여 버그가 처음부터 코드에 들어 가지 않도록합니다.


  • 나는 컴파일 타임 검사에 감사하지만, 이것은 의견의 문제로 생각된다. 새로운 속성 () {Style : "width : 100 %" } 더 간결하기 때문에 더 많은 사람들이이 목표를 달성 할 수 있습니다. HTML이 허용하는 모든 것을 구현하는 것은 엄청난 일이며, 문자열 / 람다 / 익명 클래스를 사용하여 누군가를 비난 할 수는 없습니다. - Samantha Branham

5

실제로 그것은 루비 =처럼 보입니다.) 나에게있어서 동적 인 "lookup"을위한 정적 리소스의 사용은 api 디자인 고려 사항에 맞지 않습니다.이 영리한 트릭은 api에서 선택 사항이되기를 바랍니다.

IDictionary (또는 not)로부터 상속 받아 값을 설정하기 위해 키를 추가 할 필요가 없을 때 PHP 배열처럼 동작하는 인덱서를 제공 할 수 있습니다. c #뿐만 아니라 .net 의미의 유효한 사용이 될 것이며, 여전히 문서화가 필요합니다.

이게 도움이되기를 바랍니다.


5

IMHO, 그것을하는 멋진 방법입니다. 클래스 컨트롤러의 이름을 지정하면 MVC 권한의 컨트롤러가됩니다. 그래서 명명이 중요 할 때가 있습니다.

또한 여기서 의도가 매우 분명합니다. 그것은 매우 이해하기 쉽습니다..Attribute( book => "something")결과는book="something".Attribute( log => "something")결과는log="something"

컨벤션처럼 취급한다면 문제가 될 수 없습니다. 나는 당신이 코드를 적게 만들고 의도를 명확하게 만드는 것이 무엇이든 좋은 것이라고 생각합니다.


  • 컨트롤러에 이름을 지정하지 않으면 컨트롤러에서 이름을 지정하지 않습니다. - Jordan Wallwork

4

내 견해로는 람다를 학대하는 것이다.

구문 광휘에 관해서는style=>"width:100%"명백한 혼란. 특히 때문에=>대신에=


3

메서드 (func) 이름을 잘 선택하면 유지 보수 문제를 피할 수있는 훌륭한 방법입니다 (예 : 새 func를 추가했지만 함수 - 매개 변수 매핑 목록에 추가하지 않은 경우). 물론, 문서를 많이 문서화해야하고 해당 클래스의 함수에 대한 문서의 매개 변수에 대한 문서를 자동 생성하는 것이 좋습니다 ...


1

나는 이것이 "마법의 끈"보다 낫지 않다고 생각한다. 나는 이것을 위해 익명의 유형을 많이 좋아하지 않는다. 더 나은 & 강하게 타자를 치는 접근.

연결된 질문


관련된 질문

최근 질문