C# 속성 (또는 유사한 메커니즘)이 좋은 생각이라고 생각합니까, 아니면 사용하지 않습니까?

StackOverflow https://stackoverflow.com/questions/761537

문제

지난 4 년 또는 5 년 동안 C# 속성을 사용하는 많은 디자인과 프레임 워크를 기반으로했습니다.

그러나 최근에 나는 많은 사람들이 개방적으로 자신의 사용을 낙담하거나 프레임 워크를 변경하여 필요 또는 사용을 줄이는 것을 본다.

나는 그들이 신의 선물임을 알았지 만 지금은 내가 무엇을 놓치고 있는지 궁금해하기 시작했다.

명확히하기 위해 : 구성에 대한 협약을 사용하는 것은 특히 ORM 필드에서 따라야 할 주요 원칙이되고 있습니다. 이 영역은 구성 파일 (XML)으로 필드를 매핑하거나 속성을 사용하거나 데이터베이스 테이블의 필드에 직접 맵핑하는 일반적인 이름 지정 컨벤션이있을 수 있습니다. 인용문에 대한 참조가 없지만 믹스에 다른 속성을 추가하는 것에 대한 백래시를 읽었습니다.

그러나 나는 방금 나열된 세 가지 선택에 대해 속성이 여전히 가장 의미가 있다고 생각합니다. 구성 파일은 유지하기가 더 어렵고 일반적인 이름 지정 컨벤션은 데이터베이스 필드의 구현과 연결됩니다. 속성은 필요한 위치에 정확히 배치되며 사용되는 위치에서 연결을 끊지 않고 구현이 변경 될 수 있습니다.

도움이 되었습니까?

해결책

속성에는 실제로 두 가지 목적이 있습니다 : 사용자 가시적 인 것, 컴파일러가 방출하는 것.

나는 당신이 사용자가 눈에 띄는 속성에 대해 이야기하고 있다고 가정합니다.

일반적으로 사용자 가시적 속성이 이상적이지 않다고 말합니다.

대부분의 경우 그들은 C#위에 어떤 형태의 사용자 정의 언어를 포함시키는 데 사용됩니다. dlinq 속성은 이것의 좋은 예입니다. 소비자의 관점에서 더 나은 접근 방식은 호스트 언어에 일등석 지원을 추가하는 것입니다. 그것은 훨씬 더 자연스럽게 느껴질 것입니다. (테이블과 외국 키 정의에 대한 언어 지원을받는 것은 모든 미친 Linq-to-SQL 속성과 함께 작업하기가 훨씬 쉽습니다).

그러나 실제로는 프로그래밍 언어를 확장하는 데는 대부분의 개발자에게는 너무 비용이 많이 듭니다. 혜택은 비용을 무게로 평가하지 않습니다.

아마도 언젠가 C#에는 메타 프로그래밍 기능이있어서 그런 종류의 일을 쉽게 할 것입니다.

그러나 현재 그 기능은 존재하지 않습니다.

이것은 당신에게 3 가지 옵션을 남깁니다 :

  1. 속성을 사용하십시오
  2. 동적 언어를 사용하고 런타임에 코드를 생성하십시오.
  3. 생성 프로그램을 사용하지 마십시오

일반적으로 #1은 이상적이지 않더라도 가장 쉬운 선택이됩니다.

다른 팁

이것은 일반적인 답변을 제공하기 어려운 질문입니다. 속성은 올바르게 사용될 때 엄청나게 강력하지만 남용 가능성이있는 또 다른 언어 기능입니다. 나는 속성의 사용을 완전히 버릴 수있는 강력한 이유를 본 적이 없으며 실제로 그들이 나쁜 생각이라고 생각할 이유가 없습니다.

실제로 정반대는 사실입니다. 속성을 사용하면 메타 데이터에 프레임 워크 특정 정보를 추가 할 수 있습니다. 유형 계층을 통해 쉽게 표현할 수없는 정보. 이것은 속성을 사용하는 프레임 워크의 힘을 크게 증가시킵니다.

나는 사람들이 그들을 조금 학대했지만 장관은 아무것도 학대하는 구현을 보았습니다. 더 자세하게 얘기해 주 시겠어요? 당신이 말하는 특정 속성 / 프레임 워크가 있습니까?

그것은 "캐서롤에 치즈를 넣어야한다"와 같은 꽤 광범위한 질문입니다. 두 가지 모두에 대한 대답은 "당신이 만드는 것에 달려 있습니다"입니다.

AddRibutes를 많이 사용하고 거의 선언적 프로그래밍 패러다임처럼 사용한다면 아마도 그 과정에서 어려움을 겪게 될 것입니다. 반사의 둔화에서 나오든 일반적인 유지 가능성은 누구나 추측 할 수 있습니다.

그것은 다른 모든 것과 같습니다 ... 적절할 때 사용하고 코드를보다 효율적이거나 읽을 수있게하십시오. 그것들을 사용하기 위해 그것들을 사용하지 말고, 그들을 버리기 위해 그들을 버리지 마십시오.

내 코드에 대한 메타 데이터를 정의 할 때 매우 유용하다고 생각합니다. 이를 사용하여 사용자 정의 보고서, 플러그인 아키텍처 및 타사 코드에 통신하는 데 사용합니다.

나는 당신이 컨벤션으로 모든 것을 할 수 있다고 생각하지만 나는 그들을 좋아합니다.

ASP.NET MVC에서 속성이 많이 사용됩니다. 실제로 MVC로 전환하면 속성 사용을 크게 증가 시켰습니다. 반 교정 공물 반발에 대한 당신의 인식이 어디에서 왔는지 잘 모르겠지만, 적어도 MVC와 관련하여 MS로부터 볼 수는 없습니다.

나는 특히 장식 된 컨트롤러/동작에서 크로스 절단 동작 (측면)을 제공하는 데 속성을 사용하는 방식이 마음에 듭니다. 조치 호출 전후에 속성 호출을 처리하기 위해 MVC가 어떻게 구축되었는지를 보면, 이것이 MVC에서 측면을 작동시키는 선호하는 방법이라고 믿어야합니다.

글쎄, ASP.NET MVC가 가야 할 것이라면, 나는 그것에 대해 걱정하지 말라고 말할 것입니다. 반사와 속성을 사용하여 그 프레임 워크에서 많은 문제가있어 문제가 발생하지 않습니다. MVC는 상당히 새로운 프레임 워크이며 모든 곳에서 사용됩니다. 입력, 핸들링 오류, 매우 멋진 ActionFilter 속성에 이르기까지 많은 것이 있습니다. 그래서 아니, 나는 개인적으로 그들에게 아무런 문제가 없습니다.

나는 개인적으로 대부분의 언어 기능과 마찬가지로 속성이 자리를 차지하지만 학대 또는 오용 할 수 있다고 생각합니다.

올바른 프레임 워크에서는 매우 중요합니다. 그들은 DI 프레임 워크와 같은 것들을 확실히 단순화합니다 (Mef 좋은 예), 테스트 프레임 워크와 같은 것에 매우 유용합니다.

그러나 사용자 정의 된 속성을 추가하는 것은 과잉 일 수 있다고 생각합니다. 나는 개인적으로 속성을 사용하는 것을 좋아하지만, 사용을 최소한으로 유지하고 그들이 가장 의미가있는 곳에서만 사용하려고 노력합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top