매개 변수 이름을 반영 : C # 람다 식의 남용 또는 구문 광택?


428

MvcContrib Grid 구성 요소를 보고 있으며 Grid 구문에 사용되는 구문 트릭에 매료되었지만 동시에 격퇴되었습니다 .

.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))그리고 그것은 같은 일을 의미합니다 . 그러나 MvcContrib Grid 구문이 갑자기 여기에서 변수에 대해 선택한 이름을 기반으로 적극적으로보고 결정하는 코드를 찾습니다!

C # 3.5 / 4.0 커뮤니티 및 람다 식 애호가들과의 공통 관행입니까? 아니면 내가 걱정해서는 안되는 불량한 트릭 매버릭입니까?


34
구문을 구문 분석하는 것보다 코드의 의도를 기꺼이 살펴 보는 한 이것이 분명해 보인다고 주장합니다. 좋은 코드를 읽는다면 어쨌든해야 할 것입니다. 구문은 단지 의도의 수단 일 뿐이며, 이것이 의도적 인 코드 공개라고 주장합니다.
Jamie Penney

190
방금 Anders (및 나머지 디자인 팀)에게 생각을 물었습니다. 가족 친화적 신문에서는 결과를 인쇄 할 수 없다고 가정 해 봅시다.
Eric Lippert

22
C #에는 현재 맵, 특히 함수에 전달 된 맵에 대한 깔끔하고 가벼운 구문이 없습니다. 다양한 동적 언어 (Ruby, Python, JavaScript, ColdFusion 9)는이를 위해 깨끗하고 간단한 구문을 가지고 있습니다.
yfeldblum

28
오, 기뻐 보인다. 지도의 구문에 관해서는, 새로운 {{ "Do", "A deer"}, { "Re", "golden sun"} ...}을 수행하고 컴파일러가 new [] {1, 2,3}이 int 배열의 구성을 유추하는 것처럼 맵의 구성. 우리는 이런 종류의 것들을 고려하고 있습니다.
Eric Lippert

17
에릭 리퍼 트, 나는 당신을 크게 존경하지만, 나는 당신과 그룹 (FREAKIN의 TREMENDOUSLY를 존중하는 Anders를 포함하여)이 너무 가혹하게 생각합니다. 인정 하듯이 C #에는 맵에 대한 구문이 부족하며 Ruby와 같은 다른 언어에는 큰 언어가 있습니다. 이 사람은 원하는 구문을 얻는 방법을 찾았습니다. I는 그것을 표현하는 비슷한 방법이있다 당신을 부여 할 수 있습니다 거의 적은 단점과의 구문과 같은 표현으로는. 그러나 그의 구문과 그가 그것을 얻기 위해 열심히 노력했다는 사실은 언어 향상의 필요성을 분명히 보여줍니다. 과거의 성과는 사람들이 그것을 위해 좋은 것을 만들 것이라는 것을 나타냅니다.
Charlie Flowers

답변:


147

상호 운용성이 좋지 않습니다. 예를 들어,이 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 언어에서 좋은 상호 운용성을 원할 경우 최소한 '표준'과부하 (예 : 문자열 이름을 추가 매개 변수로 사용)를 제공해야합니다.


11
당신은하지 않습니다. 이 전략은 단순히 이식 할 수 없습니다. (다른 방법으로 F #이 리턴 유형에서만 다른 메소드를 오버로드 할 수있는 경우 (유형 추론이이를 수행 할 수 있음) CLR로 표현 될 수 있지만 F #은이를 허용하지 않습니다. C #에서는 이러한 API를 호출 할 수 없습니다.) interop와 관련하여 얻을 수있는 이점과 거래되는 interop에 관한 '가장자리'기능에는 항상 상충 관계가 있습니다.
Brian

32
나는 무언가를하지 않는 이유로 비 상호 운용성을 좋아하지 않습니다. 상호 운용성이 요구 사항 인 경우, 그렇지 않으면 왜 걱정해야합니까? YAGNI IMHO입니다.
John Farrell

15
@jfar :에서 .NET CLR 토지 상호 운용성에서 생성 된 어셈블리로, 완전히 새로운 dimenssion을 가지고 어떤 컴파일러는 어떤에서 소비 해야하는 다른 언어입니다.
레무스 루사 누

25
CLS를 준수 할 필요는 없지만 라이브러리 또는 컨트롤을 작성하는 경우 좋은 아이디어 인 것 같습니다 (이 코드를 시작하는 스 니펫은 그리드에서 온 것입니까?) 그렇지 않으면 제한적입니다. 청중 / 고객 기반
JMarsch

4
아마도 Func <object, string>을 Expression << Func <object, string >>로 변경하는 것이 좋습니다. 그리고 표현식의 오른쪽을 상수로 제한한다면, 이것을 수행하는 구현을 가질 수 있습니다 : public static IDictionary <string, string> 해시 (매개 변수 Expression <Func <object, string >> [] hash) {Dictionary <string, string> 값 = 새 사전 <string, string> (); foreach (해시의 var func) {values ​​[func.Parameters [0] .Name] = (string) ((ConstantExpression) func.Body) .Value; } 반환 값; }
davidfowl 2009

154

나는 이름 때문에 그다지 이상한 것이 아니라 람다가 불필요 하기 때문에 ; 익명 유형을 사용하고 더 유연 할 수 있습니다.

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

이 ASP.NET MVC (예를 들어)의 대부분에 사용되는 패턴이며,이 다른 용도 (A 주의 , 참고도 Ayende의 생각을 이름이 마법의 값이 호출 별이 아닌 경우)


4
여기에는 interop 문제도 있습니다. 모든 언어가 익명 형식의 생성을 지원하지는 않습니다.
Brian

5
나는 아무도이 질문에 실제로 대답하지 않은 것을 좋아한다. 대신 사람들은 "이게 더 낫다"는 주장을한다. : p 그것은 남용입니까?
Sam Saffron

7
이에 대한 에릭 리퍼의 반응을보고 싶습니다. FRAMEWORK code에 있기 때문 입니다. 그리고 그것은 끔찍합니다.
Matt Hinze

26
코드가 작성된 문제가 가독성이라고 생각하지 않습니다 . 실제 문제는 코드의 학습 가능성이라고 생각합니다. 당신의 지능이 .Attributes (object obj) 라고 말할 때 어떻게 생각 하십니까? 메소드에 전달할 내용을 모르기 때문에 아무도 원하지 않는 문서를 읽어야합니다. 나는 이것이 실제로 문제의 예보다 낫다고 생각하지 않습니다.
NotDan 2009

2
@Arnis-더 융통성있는 이유 : 람다 구현 (다른 언어)에 문제를 일으킬 있는 암시 적 매개 변수 이름에 의존 하지 않지만 정의 된 속성으로 일반 객체를 사용할 수도 있습니다. 예를 들어, 당신은 할 수 HtmlAttributes(IntelliSense를위한) 예상되는 속성을 가진 클래스를 바로와 그 무시 null값을 ...
마크 Gravell

137

내 의견을 던지고 싶었습니다 (MvcContrib 그리드 구성 요소의 저자입니다).

이것은 분명히 언어 남용입니다. 의심 할 여지가 없습니다. 그러나, 나는 그것이 직감적으로 직관적이라고 생각하지 않을 것입니다-당신이 전화를 볼 때 Attributes(style => "width:100%", @class => "foo")
나는 무슨 일이 일어나고 있는지 분명하다고 생각합니다 (익명 유형 접근법보다 나쁘지 않습니다). 지능적인 관점에서 나는 그것이 불투명하다는 데 동의합니다.

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

나는 이것을 개인 취향으로 그리드에 추가했다. 나는 익명의 타입을 사전으로 사용하는 것을 좋아하지 않는다 ( "object"를 취하는 매개 변수가 Func []라는 매개 변수를 갖는 것만 큼 불투명하다). 오히려 장황한 (또한 Attribute ( "style", "display : none"). Attribute ( "class", "foo") 등에 대한 여러 호출을 함께 연결해야하는 장황한 인터페이스의 팬이 아닙니다.

C #에 사전 리터럴에 대한 덜 장황한 구문이 있으면 그리드 구성 요소 에이 구문을 포함시키지 않아도됩니다. :)

또한 MvcContrib에서 이것을 사용하는 것은 선택 사항입니다. 이들은 대신 IDictionary를 사용하는 과부하를 감싸는 확장 방법입니다. 이와 같은 방법을 제공하는 경우 다른 언어와의 상호 운용을 위해보다 '일반적인'접근 방식도 지원해야합니다.

또한 누군가가 '반사 오버 헤드'를 언급 했으며이 접근법에는 실제로 오버 헤드가 많지 않다는 것을 지적하고 싶었습니다. 런타임 리플렉션이나 표현식 컴파일이 없습니다 ( http://blog.bittercoder.com 참조) /PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx ).


1
나는 또한 내 블로그에 좀 더 깊이 여기에 제기 된 문제 중 일부를 해결하기 위해 시도했다 : jeremyskinner.co.uk/2009/12/02/lambda-abuse-the-mvccontrib-hash
제레미 스키너

4
익명 객체보다 Intellisense에서 불투명하지 않습니다.
Brad Wilson

22
인터페이스가 선택적 확장 방법을 통해 추가되었다고 언급하면 ​​+1입니다 . C #이 아닌 사용자 (및 언어 남용에 의해 기분이 상한 사람)는이를 사용하지 않을 수 있습니다.
Jørn Schou-Rode

50

내가 선호하는

Attributes.Add(string name, string value);

훨씬 더 명확하고 표준이며 람다를 사용하여 얻은 것은 없습니다.


20
그래요? (실제 HTML 생성) html.Attributes.Add("style", "width:100%");만큼 잘 읽지는 않지만 결과 HTML에서 보이는 것과 매우 비슷합니다. style = "width:100%"style => "width:100%"
Jamie Penney

6
그들의 구문은 .Attributes (id => 'foo', @class => 'bar', style => 'width : 100 %')와 같은 트릭을 허용합니다. 함수 시그니처는 가변 개수의 인수에 대해 params 구문을 사용합니다. Attributes (params Func <object, object> [] args). 그것은 매우 강력하지만 그것이 무엇 을 이해 하는 오랜 시간이 걸렸습니다 .
레무스

27
@Jamie : C # 코드를 HTML 코드처럼 보이게 만드는 것은 디자인 결정의 나쁜 이유입니다. 그것들은 완전히 다른 목적을 위해 완전히 다른 언어이며, 똑같이 보이지 않아야합니다.
Guffa

17
"아름다움"을 희생하지 않고 익명의 객체를 사용했을 수도 있습니까? .Attributes (new {id = "foo", @class = "bar", style = "width : 100 %"}) ??
Funka

10
@ 구파 왜 디자인 결정에 나쁜 이유가 될까요? 왜 똑같이 보이지 않아야합니까? 그러한 추론으로 인해 의도적으로 다르게 보입니까? 나는 당신의 잘못을 말하는 것이 아니라, 당신이 당신의 요점을 더 자세히 설명하고 싶을뿐입니다.
사만다 브랜 햄

45

Rails Land에 오신 것을 환영합니다 :)

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

Rails 프레임 워크 전체는 컨피규레이션에 대한 컨벤션에 기반을두고 있습니다. 특정 방식으로 이름을 지정하면 사용중인 컨벤션에 참여하게되며 많은 기능이 무료로 제공됩니다. 명명 규칙을 따르면 더 빨리가는 곳으로 갈 수 있습니다. 모든 것이 훌륭하게 작동합니다.

이와 같은 트릭을 본 또 다른 곳은 Moq의 메소드 호출 어설 션입니다. 람다를 전달하지만 람다는 절대 실행되지 않습니다. 단지 표현식을 사용하여 메소드 호출이 발생했는지 확인하고 그렇지 않은 경우 예외를 발생시킵니다.


3
나는 조금 주저했지만 동의합니다. 리플렉션 오버 헤드 외에도 Add ()에서와 같이 문자열을 사용하는 것과 람다 매개 변수 이름을 사용하는 것 사이에는 큰 차이가 없습니다. 적어도 내가 생각할 수있는. 두 가지 방법으로 눈치 채지 않고 "sytle"을 입력 할 수 있습니다.
사만다 브랜 햄

5
왜 이것이 나에게 이상하지 않은지 알 수 없었습니다. 그리고 난 Rails를 기억했습니다. : D
Allyn

43

이것은 하나 이상의 수준에서 끔찍 합니다. 그리고 아니, 이것은 루비와 같은 것이 아닙니다. C #과 .Net의 남용입니다.

튜플, 익명 형식, 유창한 인터페이스 등과 같이보다 직접적인 방법으로이를 수행하는 방법에 대한 제안이 많이있었습니다.

그렇게 나쁘게 만드는 것은 자신의 이익을 위해 공상하는 올바른 방법이라는 것입니다.

  • VB에서 이것을 호출하면 어떻게됩니까?

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

  • 직관적으로 지능적인 인텔리전스를 사용하면 물건을 전달하는 방법을 알아내는 데 거의 도움이되지 않습니다.

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

  • 아무도 그것을 유지하는 방법에 대한 단서가 없습니다.

  • 속성에 들어가는 인수의 유형은 무엇입니까 Func<object,string>? 그 의도가 어떻게 드러납니까? "문서의 모든 값을 무시하십시오"라는 지적 문서는 무엇입니까?

나는 당신이 그런 반감을 느끼는 것을 완전히 정당화했다고 생각합니다.


4
나는 말할 것입니다-그것은 완전히 직관적입니다. :)
Arnis Lapsa

4
당신은 루비와 같은 것이 아니라고 말합니다. 그러나 해시 테이블의 키와 값을 지정하는 루비의 구문과 매우 흡사합니다.
Charlie Flowers

3
알파 변환시 깨지는 코드! 그래!
Phil

3
@Charlie, 문법적으로는 비슷해 보이지만 의미 상으로는 다릅니다.
Sam Saffron

39

나는 "신택스 브릴 리언 스 (Syntax Brilliance)"캠프에있다. 만약 그들이 그것을 명확하게 문서화하고, 그것이이 굉장히 멋지다고 생각한다면, 그것은 거의 문제가 없다!


10
아멘 아멘 (2 번째 아멘은 의견을 위해 최소 길이를 충족해야합니다.)
Charlie Flowers

귀하의 의견만으로는 필요한 것 이상이었습니다. 그러나, 당신은 단지 한 번 아멘 후 귀하의 코멘트에 넣을 수 없습니다 : D
슬리퍼 스미스에게


21

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

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

단점

  • 코드가 직관적이지 않습니다 (일반적인 규칙이 다릅니다)
  • 깨지기 쉬운 경향이 있습니다 (매개 변수 이름을 바꾸면 기능이 작동하지 않습니다).
  • 테스트하기가 조금 더 어렵습니다 (API를 가짜로하려면 테스트에서 리플렉션을 사용해야합니다).
  • 표현식을 집중적으로 사용하는 경우 값 (반사 비용)뿐만 아니라 매개 변수를 분석해야하기 때문에 속도가 느려집니다.

찬성

  • 개발자가이 구문을 조정 한 후에 더 읽기 쉽습니다.

결론 -공개 API 디자인에서 더 명확한 방법을 선택했을 것입니다.


2
@Elisha-당신의 장단점이 반대입니다. 적어도 나는 프로가 "직관적이지 않은"코드를 가지고 있다고 말하지 않기를 바란다. ;-)
메트로 스머프

이 특별한 경우-람다 매개 변수 이름과 문자열 매개 변수는 모두 취약합니다. XML 파싱에 동적을 사용하는 것과 같습니다. 어쨌든 XML에 대해 확신 할 수 없기 때문에 적절합니다.
Arnis Lapsa

19

아닙니다. 확실히 일반적인 관행은 아닙니다. 반 직관적이므로 코드를보고 그 기능을 파악할 수있는 방법이 없습니다. 어떻게 사용되는지 이해하기 위해 어떻게 사용되는지 알아야합니다.

델리게이트 배열을 사용하여 속성을 제공하는 대신 연결 방법이 더 명확하고 성능이 우수합니다.

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

이것은 타이핑하기에 조금 더 좋지만 명확하고 직관적입니다.


6
정말? 나는 그것을 볼 때 그 코드 스 니펫의 의도를 정확히 알고있었습니다. 당신이 매우 엄격하지 않으면 그것은 둔감하지 않습니다. 문자열 연결에 대해 오버로드 +에 대해 동일한 인수를 줄 수 있으며 항상 Concat () 메서드를 사용해야합니다.
사만다 브랜 햄

4
@ 스튜어트 : 아니, 당신은 정확히 몰랐다, 당신은 사용 된 값을 기반으로 추측했다. 누구나 추측 할 수 있지만 추측은 코드를 이해하는 좋은 방법이 아닙니다.
Guffa

11
나는 사용하는 것이 .Attribute("style", "width:100%")나에게주는 것을 추측 style="width:100%"하고 있지만, 나는 그것이 나에게 줄 수 있다는 것을 알고있다 foooooo. 차이가 보이지 않습니다.
사만다 브랜 햄

5
"사용 된 값을 기준으로 추측"은 항상 코드를 볼 때 수행하는 작업입니다. stream.close () 호출이 발생하면 스트림을 닫았다 고 가정하지만 완전히 다른 작업을 수행 할 수도 있습니다.
Wouter Lievens

1
@Wouter : 코드를 읽을 때 항상 추측하는 경우 코드를 읽는 데 큰 어려움이 있어야합니다. "close"라는 메서드를 호출하면 클래스 작성자가 명명 규칙에 대해 알지 못합니다. , 그래서 나는 그 방법이하는 일에 대해 당연한 것을 취하는 것을 매우 망설입니다.
Guffa

17

이것을 사용하여 문구를 만들 수 있습니까?

매직 람다 (n) : 매직 문자열을 대체 할 목적으로 만 사용되는 람다 함수.


네 .. 재밌 네요 어쩌면 컴파일 타임 안전이 없다는 의미에서 마술 같은 것일 수도 있습니다.이 사용으로 인해 컴파일 타임 오류 대신 런타임이 발생할 수 있습니까?
Maslow


16

"회심"에 대한이 모든 논란은 오랜 시간 동안 C #을 과도하게 반응하는 사람들입니다 (그리고 저는 오랫동안 C # 프로그래머이자 여전히 언어의 팬입니다). 이 구문에는 끔찍한 것이 없습니다. 구문을 표현하려는 것과 비슷하게 만들려는 시도 일뿐입니다. 문법이 "소음"이 적을수록 프로그래머가 이해하기 쉬워집니다. 한 줄의 코드에서 노이즈를 줄이면 약간 도움이되지만 점점 더 많은 코드를 빌드하게되면 실질적인 이점으로 판명됩니다.

이것은 저자가 DSL이 제공하는 것과 동일한 이점을 얻으려고 시도한 것입니다. 이것이 interop에 적합한 지 또는 일부 "복잡성"비용을 정당화 할 수있는 익명의 방법보다 충분히 좋은지에 대해 토론 할 수 있습니다. 충분히 공평합니다. 따라서 프로젝트에서 이러한 종류의 구문을 사용할지 여부를 올바르게 선택해야합니다. 그러나 여전히 ... 이것은 프로그래머가 하루가 끝날 무렵에 우리가하려고하는 일을하려고하는 영리한 시도입니다. 그리고 우리 모두가하려고하는 것은 이것입니다. "우리가 원하는 것을 생각하는 방식에 가능한 한 가까운 언어로 컴퓨터에게 말하십시오."

내부적으로 소프트웨어를 유지 관리하고 더 정확하게 만드는 열쇠라고 생각하는 것과 같은 방식으로 컴퓨터에 지시 사항을 표현하는 데 더 가까워집니다.

편집 : 나는 "소프트웨어를 유지 관리하고 더 정확하게 유지하는 열쇠"라고 말했다. "키"로 변경했습니다.


12

이는 표현식 트리의 장점 중 하나입니다. 추가 정보는 코드 자체를 검사 할 수 있습니다. 이것이 .Where(e => e.Name == "Jamie")동등한 SQL Where 절로 변환 될 수있는 방법 입니다. 이것은 표현 트리를 영리하게 사용하지만, 이것보다 더 이상 가지 않기를 바랍니다. 더 복잡한 것은 교체하려는 코드보다 어려울 수 있으므로 자체 제한이 의심됩니다.


유효한 요점이지만 광고의 진실 : LINQ에는 TableAttribute 및 ColumnAttribute와 같은 전체 속성 집합이 포함되어있어보다 합법적 인 업무가 가능합니다. 또한 linq 매핑은 클래스 이름과 속성 이름을 확인하는데, 이는 매개 변수 이름보다 안정적입니다.
레무스 루사 누

나는 거기에 당신에 동의합니다. 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 #의 강력한 형식 검사 기능을 활용하여 버그가 코드에 먼저 들어 가지 않도록합니다.


3
컴파일 타임 검사에 감사하지만 이것이 의견의 문제라고 생각합니다. 아마 new Attributes () {Style : "width : 100 %"} 같은 것이 더 간결하기 때문에 더 많은 사람들을 이길 것입니다. 여전히 HTML이 허용하는 모든 것을 구현하는 것은 큰 일이며 문자열 / 람다 / 익명 클래스를 사용한다고 누군가를 비난 할 수는 없습니다.
사만다 브랜 햄

5

실제로 루비 =)처럼 보입니다. 적어도 나에게 역동적 인 "조회"에 정적 리소스를 사용하는 것은 API 디자인 고려 사항에 맞지 않습니다.이 영리한 트릭이 해당 API에서 선택 사항이기를 바랍니다.

우리는 IDictionary에서 상속 받거나 값을 설정하기 위해 키를 추가 할 필요가 없을 때 PHP 배열처럼 동작하는 인덱서를 제공 할 수 있습니다. C #뿐만 아니라 .net 시맨틱의 올바른 사용이며 여전히 문서가 필요합니다.

도움이 되었기를 바랍니다


4

내 생각에 그것은 람다의 남용입니다.

구문의 광채에 관해서는 style=>"width:100%"혼란스러워합니다. 특히 =>대신에=


4

IMHO, 그것은 그것을하는 멋진 방법입니다. 우리는 클래스 컨트롤러의 이름을 MVC의 컨트롤러로 지정한다는 사실을 좋아합니다. 따라서 이름이 중요한 경우가 있습니다.

또한 그 의도는 매우 분명합니다. 그것은 그 이해하는 것이 매우 쉽게 .Attribute( book => "something")발생합니다 book="something".Attribute( log => "something")발생합니다log="something"

컨벤션처럼 취급한다면 문제가되지 않을 것 같습니다. 코드를 적게 작성하고 의도를 분명하게 만드는 것은 좋은 일이라고 생각합니다.


4
컨트롤러에서 상속받지 않으면 클래스 컨트롤러 이름을 짓지 않아도 쪼그리고
앉지

3

방법 (func) 이름을 잘 선택하면 유지 관리 문제를 피할 수있는 훌륭한 방법입니다 (예 : 새 func를 추가하지만 function-parameter mapping 목록에 추가하는 것을 잊었습니다). 물론 문서를 많이 문서화해야하며 해당 클래스의 함수에 대한 문서에서 매개 변수에 대한 문서를 자동 생성하는 것이 좋습니다.


1

나는 이것이 "매직 스트링"보다 낫다고 생각합니다. 나는 이것에 대한 익명 유형의 팬이 아닙니다. 더 좋고 강력한 형식의 접근 방식이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.