c# - 위치 - 인터페이스에 'I'접두사를 사용하거나 사용하지 않으려면



레이아웃 java (13)

그것이 질문입니까? 그렇다면 AC # 프로젝트를 개발할 때이 협약을 사용하지 않는 것이 얼마나 큰 죄입니까? 이 규칙은 .NET 클래스 라이브러리에서 널리 사용됩니다. 그러나, 나는 냉정하게 말하면서 팬이 아니며, 단지 미학적 이유로 만이 아니라 어떤 기여도하지 않는다고 생각합니다. 예를 들어 IPSec 인터페이스가 PSec입니까? Is IIOPConnection IOPConnection의 인터페이스입니다. 일반적으로 어쨌든 정의를 찾습니다.

  • 그렇다면이 협약을 사용하지 않을 경우 혼란이 생길 ​​수 있습니다.
  • 이 컨벤션을 중단하는 C # 프로젝트 또는 라이브러리가 있습니까?
  • 아쉽게도 Apache Wicket이하는 것처럼 규칙을 혼합 한 C # 프로젝트를 수행합니까?

자바 클래스 라이브러리는 수년 동안 존재하지 않았지만, 내가없이 코드를 읽는 데 어려움을 겪어 본 적이 없다. 또한 인터페이스가 가장 원시적 인 설명이 아니어야합니까? 나는 List <T> 및 List <T> 또는 심지어 CopyOnWriteArrayList <T>를 가지는 것이 더 좋지 않은가요? 클래스는 구현을 설명합니다. 나는 C #의 List <T>에서하는 것보다 더 많은 정보를 얻는다 고 생각한다.

https://src-bin.com


Answer #1
  1. 그것은 본질적으로 죄가 아닙니다. 그것은 최선의 방법 입니다. 그것은 모든 것들을 훨씬 더 읽을 수있게합니다. 또한 그것에 대해 생각해보십시오. IMyClassMyClass 대한 인터페이스입니다. 그것은 단지 의미가 있으며, 불필요한 혼란을 멈추게합니다. 또한 : 구문 대 implements/extends 기억하십시오. 마지막으로 툴팁을 확인하거나 VS로 이동하여이 모든 작업을 무시할 있지만 읽기 쉽도록 표준이 중요합니다.

  2. 내가 알고있는 것은 아니지만 그들이 존재한다고 확신합니다.

  3. 아무 것도 보지 못했지만 그들이 존재한다고 확신합니다.


Answer #2

BCL에서 인터페이스를 사용하고 일관성을 유지하려면 사용해야하기 때문에 컨벤션에만 전념합니다.

나는 대회도 좋아하지 않는다.


Answer #3

Java와 C #의 차이점은 Java가 인터페이스를 구현하는지 또는 클래스를 확장 할지를 쉽게 식별 할 수있게 해줍니다. 해당 키워드가 implements 되고 extends 되기 때문입니다.

C #은 : 구현 또는 확장을 표현하기 위해 표준을 따르고 인터페이스 이름 앞에 I를 두는 것이 좋습니다.


Answer #4

나는 I-Prefix의 주된 이유는 그것을 사용하는 사람들이 인터페이스를 볼 수 있지만 기존 클래스와 인터페이스에서 구현 / 파생되는 것이 인터페이스 나 기본 클래스를보다 쉽게 ​​볼 수 있다고 생각하지 않는다고 생각합니다.

또 다른 장점은 다음과 같은 바보 같은 일을 막을 수 있다는 것입니다.

List foo = new List(); // Why does it fail?

세 번째 이점은 리팩토링입니다. 객체를 이동하고 코드를 읽으면 인터페이스 별 코드를 잊어 버린 곳을 볼 수 있습니다. "접두사가없는 타입을 받아들이는 방법? 고쳐라!".

나는 Java로도 사용했고 매우 유용하다고 생각했지만 항상 회사 / 팀의 지침에 따라 다릅니다. 그 (것)들을 따르십시오, 아무리 어리석은 당신이 생각할지도 모르다, 언젠가 당신은 존재할 행복 할 것이다.


Answer #5

내 생각에 모범 사례가 때로는 대회보다 우선합니다. 개인적으로 컨벤션을 좋아하지 않을 수도 있지만 컨벤션을 사용하지 않는 것이 생각보다 오래 머물러있는 최고의 관행에 어긋납니다.

이 경우 다른 사람들이 어떻게하는지에 관해서는 더 많이 보게 될 것입니다. 공통 세계의 99 %가 "I"로 시작될 것이므로이 모범 사례를 유지하기에 충분합니다. 계약자 또는 새 개발자를 데려 와야하는 경우 코드에 집중할 수 있어야하고 개발자가 선택한 선택을 설명하거나 방어 할 필요가 없습니다.

그것은 충분히 길었고, 충분히 평온 해 졌기 때문에 나는 그것이 평생 동안 바뀌 길 기대하지 않습니다. 그것은 "필기되지 않은 규칙"중 하나 일 뿐이며, "필기되지 않은 모범 사례"로 더 잘 정의됩니다.


Answer #6

내 의견으로는 "I"가 접두어로 사용되는 가장 큰 이유는 Java (Eclipse) 및 .NET (V Studio) 용 IDE가보고있는 클래스가 실제로 인터페이스라는 사실을 명확하게 나타내지 않는다는 것입니다. Eclipse에서 패키지 브라우저는 클래스 파일을 확장 할 때까지 동일한 아이콘을 표시하며 Interface 선언의 글꼴은 클래스와 다르지 않습니다.

예를 들면 다음과 같습니다.

ISomeInterface s = factory.create();

ISomeInterface는 인터페이스 (이탤릭체 또는 밑줄과 같은)를 표시하기 위해 적어도 일종의 글꼴 수정이 있어야합니다.

또 다른 큰 이유는 자바 세계에서 "I"접두사 접두사는 Eclipse에서 "Ctrl-Shift-R"을 수행하고 인터페이스 만 검색하는 것이 더 쉽다는 것입니다.

이것은 AOP 마법이나 다른 동적 프록시를 사용할 계획이라면 공동 작업자로 인터페이스가 필요한 Java / Spring 환경에서 중요합니다.

인터페이스 앞에 "I"접두어를 붙이거나 구현 클래스에 ListImpl과 같은 "Impl"을 접미사로 사용하는 것보다 낫습니다. 나는 인터페이스를 만들기 위해 "Impl"로 클래스의 접미사를 몹시 싫어하며 구체적인 이름은 "I"의 접두사 접두사와 다릅니다.

일반적으로 나는 많은 인터페이스를 만드는 것을 피하려고 노력한다.

내 자신의 코드에서 나는 결코 "I"로 시작하지 않을 것입니다. 나는 사람들이 왜 오래된 코드 일관성을위한 몇 가지 이유를 제공 할뿐입니다.


Answer #7

우리 모두를 돕기위한 협약이 있습니다. .net 개발자가 귀하와 협력하게 될 가능성이 있다면, 그 규칙을 따르십시오.


Answer #8

이 컨벤션을 따르지 않으면 .NET 지옥이 생겨날 것입니다. 이것은 파이썬에서 인스턴스 메서드에서 self 를 사용하는 것만큼이나 중요합니다.


Answer #9

자문 해보십시오 : IDE에서 텍스트 형식 (예 : 다른 색, 밑줄, 이탤릭체)에 힌트를 줄 수 있다면 인터페이스가 문제가 될 수 있습니까?

이름처럼 정의의 일부에 대해 이름에서 알 수 있도록 유형 이름을 지정하는 것처럼 들립니다.


Answer #10

저의 오피온온에서도 나쁜 습관입니다. 이유는 다음과 같습니다.

  • 인터페이스의 모든 목적은 구현 세부 사항을 추상화하는 것입니다. 따라서 IParam 또는 Param을 사용하여 메서드를 호출하면 중요하지 않습니다.
  • 정교한 도구는 인터페이스를 아이콘으로 표시 할 수있는 고유 한 가능성을 가지고 있습니다.
  • 눈에서 IDE에서 이름을 검색하는 경우 가장 중요한 부분은 문자열의 시작입니다. 어쩌면 당신의 수업은 알파벳순으로 정렬 될 것입니다. 그리고 이제는 비슷한 이름의 블록을 가지고 있습니다. 나는 모두 함께 시작합니다 ... 함께. 유사하게 보이지만 쉽게 구분할 수있는 장점이 있습니다. I- 접두사를 사용하는 것은 인체 공학적으로 잘못되었습니다.
  • 더 성가신 : ImplList, ImplThat, 추상 Foo의 경우 AFoo, Bar를 구현하는 추상 Foo의 경우 AImplFooBar? SSomething as Singleton, 또는 정적 클래스에 대한 SMath? 멈춰! :)

Answer #11

프로그램의 모든 이름을 원하는대로 선택할 수 있지만 이름 변환을 유지하는 것이 좋습니다. 그렇지 않으면 프로그램 만 읽게됩니다.

인터페이스의 사용법은 당신이 당신 자신의 클래스와 인터페이스를 디자인 할 때뿐만 아니라 유용합니다. 어떤 경우에는 프로그램에서 다른 액센트를 사용합니다. 인터페이스를 사용합니다. 예를 들어 다음과 같은 코드를 작성할 수 있습니다.

SqlDataReader dr = cmd.ExecuteReader (CommandBehavior.SequentialAccess);
if (!dr.HasRows) {
    // ...
}
while (dr.Read ()) {
    string name = dr.GetString (0);
    // ...
}

~처럼

IDataReader dr = cmd.ExecuteReader (CommandBehavior.SequentialAccess);
if (!dr.HasRows) {
    // ...
}
while (dr.Read ()) {
    string name = dr.GetString (0);
    // ...
}

마지막 하나는 똑같아 보이지만 SqlDataReader 대신 IDataReader 를 사용하는 경우 SqlDataReader 클래스 ( OleDbDataReader , OracleDataReader , OdbcDataReader 등)와 함께 작동하는 메서드에서 dr과 함께 작동하는 일부 파트를 배치하기가 더 쉽습니다. . 반면에 프로그램은 이전과 똑같이 빠르게 작동합니다.

업데이트 됨 (의견의 질문에 기반) :

장점은 IDataReader 와 함께 작동하는 코드의 일부를 분리 하면 이전에 작성한 것과 마찬가지입니다. 예를 들어 delegate T ReadRowFromDataReader<T> (IDataReader dr, ...) 하고 while (dr.Read ()) 블록 내부에서 사용합니다. 따라서 SqlDataReader 직접 사용하는 코드로 더 일반적인 코드를 작성하십시오. while (dr.Read ()) 내부에서 rowReader (dr, ...) 를 호출하는 rowReader (dr, ...) 차단합니다. 데이터 행을 읽는 다른 코드 구현은 서명 ReadRowFromDataReader<T> rowReader 가있는 메소드에 배치하여 실제 매개 변수로 배치 할 수 있습니다.

방법을 사용하면 데이터베이스로 작업하는보다 독립적 인 코드를 작성할 수 있습니다. 처음에는 일반 대리인을 사용하는 것이 조금 복잡해 보였지만 모든 코드는 읽기가 쉽습니다. 한 번 더 강조하고 싶습니다.이 경우 다른 방법으로 코드의 일부를 분리해야만 인터페이스를 사용할 수 있다는 이점이 있습니다. 코드를 분리하지 않으면받는 유일한 이점은 독립된 코드 부분을 받고 다른 부분에서이 부분을 더 쉽게 복사 할 수 있다는 것입니다.

'I'로 시작하는 이름의 사용은 이제 우리가 하나의 클래스처럼 좀 더 일반적인 것으로 작업한다는 것을 이해하기 쉽게 만듭니다.


Answer #12

한 가지 아이디어는 인터페이스를 구현하는 클래스가 수행하는 "I"부분 다음에 동사가 올 수 있다는 것입니다. 좋은 인간 언어 이름을 형성하는 ISaveXmlData 좋아 ISaveXmlData .


Answer #13

this 읽고 계속 나아가 라. Java를 사용하는 경우 Java 명명 규칙을 따르십시오.





java