문제

나는 본 적이 없습니다 팬에는 헝가리 표기에,나는 항상 그것은 아주 쓸모 없는 일을 하는 일부를 정말 낮은 수준의 프로그래밍하지만,모든 C++프로젝트 일했에 어떤 종류의 헝가리 표기 정책 적용되었고,그것의 사용 일부는'아니다 정말로-헝가리어'앞으로 m_ 필드 s_ 에 대한 통계,g_ 에 대한 전역에.

나는 곧 깨달은 얼마나 쓸모없는에서 이었 C#점차적으로 시작하는 모든 나의 오래된 습관을...하지만'm_'일이다.나는 여전히 사용하 m_ 접두사에서 프라이빗 필드기 때문에 나는 진짜로 그것은 매우 유용할 수 있는 구분 매개변수,지역 주민과 필드가 있습니다.

이름 규칙을 위한 필드 페이지에 MSDN 내가 없지만,그 말을하지 않는 이유(방법 예:구글의 규칙적으로는 경향이 있을 합리화하는 그들의 처방).

이 있는 이유는 나가지 않아야 또는 그것의 문제만 스타일입니다.후자의 경우,는 접두어를 일반적으로 간주 나쁜 스타일과 기대할 수 있는 부정적인 반응을 다른 사람들로부터 작업 codebase?

도움이 되었습니까?

해결책

회원 필드의 언더 베어 접두사가 마음에 듭니다. 대부분의 방식으로, 모든 멤버 필드는 화면 상단의 마법사 막대에서 내 방법 앞에 알파벳순으로 표시됩니다.

WizardBar

다른 팁

당신이해야 할 때 :

  • 프로젝트 코딩 가이드 라인이 말할 때

당신이하지 말아야 할 때 :

  • 프로젝트 코딩 가이드 라인이 말할 때는 안됩니다

아직 가이드 라인이 없다면, 귀하 나 팀이 원하는 것을 선택하고 가장 편안하게 느낄 수 있습니다. 개인적으로 C ++를 코딩 할 때 멤버에게 M_을 사용하는 경향이 있으므로 도움이됩니다. 다른 언어, 특히 진정한 클래스가없는 언어 (JavaScript, LUA)로 코딩 할 때는 그렇지 않습니다.

요컨대 나는 "올바른"과 "잘못된"방법이 있다고 생각하지 않습니다.

C# 3.0의 자동 구현 된 특성 기능은이 컨벤션에 대한 필요성이 적습니다. 글쓰기 대신

string m_name;
public string Name { get { return m_name; } }

또는

string _Name;
public string Name { get { return _Name; } }

(또는 다른 대회), 이제 쓸 수 있습니다.

public string Name { get; private set; }

더 이상 명시 적 뒷면 스토어 변수가 필요하지 않기 때문에 더 이상 이름을 생각해 낼 필요가 없습니다. 따라서이 전체 토론을 피하십시오.

분명히,이 주장은 유효성 검사를 수행하는 것과 같은 명백한 후원 저장소가 필요할 때 적용되지 않습니다.

일부 사람들이 언급 한 바와 같이 MS 지침은 다음과 같습니다.

필드 이름에는 접두사를 사용하지 마십시오. 예를 들어, 정적 대 비 정적 필드를 구별하기 위해 G_ 또는 S_을 사용하지 마십시오.

나는 이것에 동의한다. 접두사는 코드를 추악하고 낭비하는 캐릭터로 폐기물 공간을 보이게 만듭니다. 그러나, 필드와 부동산이 모두 같은 이름을 가질 수있는 필드에 필드를 사용하는 것이 일반적입니다 (개인 필드는 낙타 케이스와 속성이 파스칼 케이스입니다). VB에서는 VB가 대소 문자를 사용하지 않기 때문에 작동하지 않습니다. 이 시나리오에서는 단일 _ 접두사를 사용하는 것이 좋습니다. 그 이상도 이하도 아닌. 그것은 단지 더 깨끗해 보인다, IMHO.

나는 m_, s_, 그냥 _, 그리고 접두사가 전혀 실험되지 않았다. 모든 정적 및 인스턴스 변수에 대해서만 _ 만 사용했습니다. 정적 변수를 인스턴스 변수와 구별하는 것이 중요하지 않습니다. 이론적으로는 좋은 소리가 나고, 실제로는 문제를 일으키지 않습니다.

한 동료는 한때 모든 접두사를 제거하기 위해 설득력있는 주장을했고, 우리는 하나의 프로젝트에서 시도해 보았고 예상 한 것보다 더 잘 작동했습니다. 나는 그것을 다음 프로젝트로 전달하고 그것이 IntelliSense와 "방해 "다는 것이 화가났다. 다음 상황이있을 때

int foo;
public int Foo
{
  get { return foo; }
}

foo를 입력하기 시작하면 인스턴스 변수와 속성이 모두 제안됩니다. 밑줄로 변수를 접두사하면 성가신 이중 제안이 제거되므로 _ 만 사용하여 다시 전환했습니다.

나는 따라 노력한다 MSDN .NET 라이브러리 가이드 라인. 여기에는 a가 포함됩니다 이름 지침 부분.

분명히, 이것들은 프로젝트 지침에 부차적입니다.

"m"은 밑줄을 사용한 밑줄과 함께 속성 백업 필드를 표시하는 것을 선호합니다. 하나는 내가 그것들을 사용할 때 그것들을 Intelisense 목록의 맨 위에 놓습니다.

나는 MSDN의 지침을 닦아야한다는 것을 인정할 것입니다. 요즘에는 상황이 너무 빨리 변할 수 있습니다.

Resharper와 같은 도구는 실제로 접두사의 이유가 없습니다. 또한 짧은 방법을 작성하면 VAR이 어디에서 왔는지 빨리 알 수 있어야합니다. 마지막으로, 나는 당신이 할 수없는 일을하려고한다면 다시 resharper가 다시 줄을 뻗을 것이기 때문에 정적 또는 정적 사이의 차이를 말해야 할 필요성을 실제로 보지 못할 것 같아요. resharper가 없어도 컴파일러가 저장했을 것입니다.

나는 항상 멤버 변수를 접두사합니다 중_ 그리고 정적 변수 에스_ 당신이 말하는 것과 같은 이유로. 어떤 사람들은 밑줄이있는 멤버 변수를 접두사하지만, 나는 항상 이것을 조금 이상하게 보았습니다 (그러나 그것은 개인적인 취향 일뿐입니다).

내가 함께 일하는 대부분의 사람들은 M_/S_ 접두사를 사용합니다. 나는 당신이 일관성이있는 한 그것이 당신이 사용하는 것에 너무 중요하다고 생각하지 않습니다.

나는 그들을 사용하지 않습니다. 조잡한 코딩을 장려합니다. MSDN 코딩 가이드 라인은 그곳에있는 곳입니다.

다음은 _ (m_가 아닌)를 사용해야하는 몇 가지 이유가 있습니다.

(1) 많은 BCL 사람들이 MS의 명명 가이드에도 불구하고 그것을합니다. (확인하십시오 블로그.) 그 사람들은 프레임 워크를 작성하므로 복사 할 가치가있는 좋은 습관이 있습니다. MSDN에서 가장 유용한 예제 코드 중 일부는 그들에 의해 작성되므로 밑줄 컨벤션을 사용합니다. 그것은 사실상 산업 표준입니다.

(2) 단일 밑줄은 단순히 소스를 읽음으로써 방법과 클래스 수준 변수를 명확하게하는 눈에 띄지 만 눈에 띄지 않는 방법입니다. 사람들이 새로운 (또는 오래된) 코드를 이해하는 데 도움이됩니다. 장간 읽을 때. 그렇습니다. IDE에서 이것을 볼 수는 있지만, 우리는 강요해서는 안됩니다. 텍스트 편집기에서 읽거나 종이에 감히 말할 수 있습니다.

(3) 일부는 방법이 짧아서 접두사가 필요하지 않다고 말하고 나중에 필요한 경우 필드를 자동 구현 속성으로 변경할 수 있습니다. 그러나 실제 방법에서는 필요한만큼 길고 필드와 속성 사이에 중요한 차이가 있습니다 (예 : 직렬화 및 초기화).

각주 : M_의 멤버의 "M"은 여기서 사용에서 중복되어 있지만, 이러한 오래된 이름 지정 규칙의 많은 아이디어 중 하나가 상류로 시작되었고 인스턴스 이름이 소문자로 시작되었다는 것이었기 때문에 소문자였습니다. .NET에는 적용되지 않으므로 이중 중복됩니다. 또한 헝가리 표기법은 때때로 오래된 C 컴파일러 (예 : 정수 또는 포인터 캐스팅 및 산술)에 유용했지만 C ++에서도 수업을 다룰 때 유용성이 줄어들 었습니다.

C ++와 C#사이에는 하나의 중요한 차이점이 있습니다 : 도구 지원. 확립 된 지침 (또는 일반적인 변형)을 따르면 C ++가 없었던 깊은 수준의 도구 지원을 얻게됩니다. 표준에 따라 도구를 사용하면 도구가 다른 방법보다 더 깊은 리팩토링/이름 바꾸기 작업을 수행 할 수 있습니다. Resharper가 이것을합니다. 따라서 확립 된 표준 중 하나를 고수하십시오.

@John Kraft가 언급했듯이 "올바른"대답은 없습니다. Mattj는 가장 가까운 곳입니다. 항상 회사의 스타일 지침을 따라야합니다. 로마에있을 때.

내 개인적인 의견에 관해서는, 여기서 요구되기 때문에 나는 당신이 떨어 뜨리는 데 투표합니다. m_ 전적으로.

나는 최고의 스타일이 모든 회원이있는 곳이라고 생각합니다. PascalCased, 가시성에 관계없이 (이는 심지어 의미가 있습니다 private 회원), 그리고 모든 주장은입니다 camelCased. 나는이 스타일을 깨지 않는다.

나는 재산 지원 스토어 필드를 접두하려는 욕구를 이해할 수 있습니다. 결국 필드와 재산을 구별해야합니다. 동의합니다. 그러나 포스트 픽스를 사용하십시오.

대신에 m_MyProperty (또는 _MyProperty, 내가 본 적이 있고 심지어 옛날에 홍보 한), 사용 MyPropertyValue. 읽고 이해하기가 더 쉽고, 더 중요한 것은 IntelliSense의 원래 속성 이름에 가깝습니다.

궁극적으로 이것이 제가 포스트 픽스를 선호하는 이유입니다. 액세스하고 싶다면 MyPropertyValue Intellisense 사용 (일반적으로) 유형 "My <down-arrow> <tab>", 그 이후로 당신은 MyProperty 그리고 MyPropertyValue 목록에 있습니다. 액세스하려면 m_MyProperty Intellisense를 사용하면 입력해야합니다.m_My <tab>".

제 생각에는 키 스트로크 경제에 관한 것입니다.

나는 결코 이것을하지 않으며 그 이유는 내가 내 방법을 짧게 유지하려고하는 이유입니다. 화면에서 전체 메소드를 볼 수 있다면 매개 변수를 볼 수 있고 현지인을 볼 수 있으므로 수업이 소유 한 내용과 매개 변수 또는 지역이 무엇인지 알 수 있습니다.

나는 일반적으로 특정 표기법을 사용하여 내 매개 변수와 현지인의 이름을 지정하지만 항상 그런 것은 아닙니다. 일관성이 없다면 나는 아무것도 없습니다. 나는 내 방법이 짧다는 사실에 의존하고 X 만 수행해야 할 때 X, Y 및 Z를 수행하지 않도록 노력합니다.

어쨌든, 그것은 내 두 센트입니다.

코드를 편집하기 위해 VI 또는 EMACS에 갇히지 않는 한, IDE는 저를 위해 멤버의 차별화 표시를 처리하므로 특별 규칙을 거의 사용하지 않습니다. 그것은 또한 I 또는 C 클래스와 함께 인터페이스를 접두사하는 경우에도 적용됩니다.

누군가, 인터페이스에서 .net 스타일의 i-prefix 스타일을 설명하십시오. :)

내가 익숙한 것은 개인 속성이 작은 밑줄 f.ex "String _name"을 얻었다는 것입니다. 대중은 "이름"을 얻었습니다. 메소드의 입력 변수는 "void myMethod (문자열 이름)"작은 문자를 얻었습니다.

당신이 정적 인 const를 가지고 있다면 종종 큰 글자로 쓰여집니다. static const MYCONST = "hmpf".

나는 선택이 주어질 때마다 헝가리 사마귀를 사용하지 않습니다. 추가 타이핑이며 의미있는 정보를 전달하지 않습니다. 좋은 IDE (그리고이 기능의 존재에 따라 "좋은"을 정의합니다)는 정적 멤버, 인스턴스 멤버, 멤버 기능, 유형 등에 대해 다른 구문 강조 표시를 할 수 있습니다. IDE가 제공 할 수있는 정보가 포함 된 코드. 버전 관리 시스템이 해당 내용을 담당해야하기 때문에 댓글이 내려진 오래된 코드로 코드를 혼란스럽게하지 않아야합니다.

가장 좋은 방법은 동료들과 표준에 동의하고 그것을 고수하는 것입니다. 모든 사람에게 가장 잘 맞는 방법 일 필요는 없으며, 한 방법에 동의하는 것이 실제로 동의하는 방법보다 더 중요합니다.

코드 표준을 위해 선택한 것은 _ _를 멤버 변수의 접두사로 사용하는 것입니다. 그 이유 중 하나는 Intellisense에서 로컬 변수를 쉽게 찾을 수 있기 때문입니다.

우리가 그 표준에 동의하기 전에 나는 다른 표준을 사용했습니다. 나는 어떤 접두사도 전혀 사용하지 않았고 this.memberVariable 코드에서 멤버 변수를 사용하고 있음을 보여줍니다.

C# 3의 속성 속성으로, 나는 훨씬 덜 명시적인 멤버 변수를 사용한다는 것을 알았습니다.

공식 가이드 라인에 가장 가까운 것은입니다 스타일 콥, 소스 파일을 자동으로 분석하고 권장 코딩 스타일에서 위반을 감지 할 수있는 Microsoft의 도구로 MSBuild와 같은 Visual Studio 및/또는 자동화 된 빌드 내에서 실행할 수 있습니다.

우리는 프로젝트에서 그것을 사용하며 개발자간에 코드 스타일과 레이아웃을보다 일관성있게 만드는 데 도움이됩니다. 상당히 약간 익숙해지고 있습니다!

귀하의 질문에 답하기 위해 - 헝가리 표기법이나 다음과 같은 접두사를 허용하지 않습니다. m_ (실제로, 그것은 밑줄을 전혀 사용하지 못합니다).

나는 더 이상 그 스타일을 사용하지 않습니다. 변수가 어떻게 사용되는지 신속하게 보도록 도와주기 위해 개발되었습니다. 최신 DEV 환경을 통해 마우스를 변수 위로 가져 가서 해당 정보를 볼 수 있습니다. 새로운 도구를 사용하면 필요가 사라졌습니다.

수집 할 통찰력도있을 수 있습니다. C ++ 코딩 표준 (Sutter, 허브 그리고 Alexandrescum Andrei, 2004). 항목 #0은 "작은 물건을 땀을 흘리지 마십시오. (또는 : 표준화하지 않는 것이 무엇인지 알고 있습니다.)"라는 제목이 있습니다.

그들은이 특정 질문에 대해 "자신의 이름 지정 컨벤션을 결정할 수 없다면 ... 개인 회원 변수를 시도해보십시오. 이와 같이_ ... "(선행 밑줄의 사용은 C ++에서 매우 구체적인 규칙을 준수한다는 것을 기억하십시오).

그러나 그곳에 도착하기 전에 그들은 일정 수준의 일관성을 강조합니다. "중요한 것은 규칙을 설정하는 것이 아니라 파일 내에서 이미 사용중인 스타일과 일치하는 것입니다 ..."

C/C ++ 에서이 표기법의 이점은 선언을 검색하지 않고도 기호의 유형이 무엇인지 쉽게 알 수 있도록하는 것이 었습니다. 이 스타일은 Intellisense가 도착하기 전에 나타 났고 "정의로 이동" - 우리는 종종 헤더 파일 수를 알고있는 사람의 선언을 찾는 거위 추격을해야했습니다. 큰 프로젝트에서 이것은 C 소스 코드를 볼 때 충분히 나쁜 성가심이 될 수 있지만 혼합 어셈블리+소스 코드와 원시 통화 스택을 사용하여 법의학을 수행 할 때도 더 나쁩니다.

이러한 현실에 직면했을 때 M_와 다른 헝가리 규칙을 사용하는 것은 낯선 코드를 볼 때 기호의 유형을 찾는 데 얼마나 많은 시간을 절약 할 수 있기 때문에 유지 보수 오버 헤드에도 불구하고 약간의 의미가 시작됩니다. 물론 우리는 Intellisense와 "정의로 이동"을 가지고 있기 때문에 그 이름 지정 컨벤션의 주요 시간을 절약하는 동기는 더 이상 존재하지 않습니다. 나는 더 이상 그렇게 할 수있는 점이 많지 않다고 생각하며, 일반적으로 일관되고 약간 더 많은 도구 지원을 얻기 위해 .NET 라이브러리 가이드 라인을 사용하려고 노력합니다.

나는 것을 확실히 얻을 타오르는 이를 위해 그러나 할 수 없는 일입니다.

그것은이라는 Microsoft's.네트워크 라이브러리 지침이지만 그것이 정말로 브래드스의 망(여기서 문서)-다른 뷰가 있으로 유효한 이유가 있습니다.

사람들은 이동하는 경향이 대부분이기 보다는 오히려 좋은 솔리드는 이유에 대한 특정한 스타일입니다.

중요한 점을 평가하는 이유는 특정 스타일은 사용하고 왜 그것이 선호하는 또 다른 스타일-즉위한 이유가 스타일을 선택하지 않기 때문에 그냥 사람들이 말하는 것을 자기 생각합니다.

기본적인 이유로 사용하지 않는 이전 스타일 헝가리어의 사용이었 약어는 다른 모든 팀과 배우기 어려운-이것은 쉽게 의해 해결되지 않 abbreviating.

로 사용할 수 있는 개발 도구로는 스타일을 변경 변경되어야 합니다 무엇 대부분의 감각-하지만 단단한 이유에 대한 각각의 스타일의 항목입니다.

아래에 나타일 가이드라인으로 내 이유-난 항상을 향상시킬 수있는 방법을 찾고 내일을 만들은 믿을 수 있고 쉽게를 유지하는 코드입니다.

변수 이름 지정 규칙

우리 모두가 우리의 보기에는 변수 이름 지정 규칙을 따릅니다.많은 다른 스타일을 생산 하는 데 도움이 됩니다 쉽게 유지가능한 코드의 품질-모든 스타일을 지원하는 기본적인에 대한 필수 정보를 변수는 괜찮습니다.기준에 대한 특정한 이름 지정 규칙이 되어야 한다 에이즈에서 생산하는 코드는 믿을 수 있고 쉽게 유지할 수 있습니다.는 기준을 사용할 수 없습니다:그것은 추한 마이크로소프트(즉브래드스)는 말을 사용하지 않는 스타일-Microsoft 를 생성하지 않는 가장 신뢰할 수 있는 코드 그냥 버그에 표현합니다.그것은 매우 중요한 읽는 경우에는 코드가 변수 이름에 즉시 전달하는 세가지 필수적인 사실에 대해 변수:그것의 범위 그것은 유형 명확하게 이해하는 것이 무엇인지에 대해 사용되는 범위:이 좋습에 완전히 의지하의 컴포넌트입니다.IntelliSense 것입그러나,하나는 단순히지 않는 마우스를 통해 모든 변수를 참조 범위 및 형식입니다.가정 변수는 범위에서 그것을 일으킬 수 있 중요한 오류가 있습니다.는 경우,예를 들어,참조 변수로 전달된 매개 변수는 그 변경에 로컬 범위는 변경 후에 남아 있을 것이 메서드를 반환할 수 있는지할 수 있습니다.는 경우 또는 필드에 정적 변수를 수정 지역 범위를 하지만 생각하는 지역 변수 예기치 않은 행동이 발생할 수 있습니다.따라서 그것은 매우 중요할 수 있을 살펴보면 변하지 않는(마우스)에 즉시 그것을 알고의 범위가 있습니다.

다음 스타일을 나타내기 위한 범위는 제안;그러나 어떤 스타일이 완벽하게 괜찮으로 한 명확하고 일관성을 나타내는 변수의 범위:m_ 필드 변수 p_ 전달된 매개 변수하는 방법 s_static variable 지역 변수 유형:심각한 오류가 발생할 수 있습을 믿는다면 그들은 작업으로는 특정 유형을 때 그들은 실제로는 다른 유형의 다시,우리는 단순히지 않는 마우스를 통해 이제까지 변수를 결정하는 그것의 종류,우리는 가정하에 우리가 알고 있는 무슨 형식이 그리고 어떻게 오류가 만들어집니다.

약어:약어는 악기 때문에 그에게 다른 것들을 의미할 수 있습 다른 개발자입니다.하나 개발자도 생각하는 주요한 낮은 경우"s"문자열이 의미하는 동안 또 다른 생각할 수 있습니다 그것이 의미인 정수입니다.약어는 표시의 게으른 코딩-을 조금 더 시간 전체 이름을 입력하여 그것을 명확하게 개발자가를 유지하는 코드입니다.예를 들어,차이"str"과"문자열"은 세 가지 캐릭터를 사용하지 않을 훨씬 더 많은 노력을 코드를 간단하게 유지합니다.

일반적이고 명확한 약어를 위한 내장 데이터의 유형이만 허용해야 하는 표준화합니다.

자기 문서화 코드:추가에 대한 명확한 설명을 변수 이름은 매우 쉽게 다른 개발자를 읽고 이해하는 코드 이름을 그렇게 이해할 수있는 팀의 관리자를 읽을 수 있고 이해되지 않고 개발자.

순서의 변수 이름을 부:권장하는 순서는 범위-유형-기 때문에 설명:IntelliSense 것이 그룹의 모든 유사한 범위 내에서 각 범위 IntelliSense 것이 그룹의 모든 유사한 형식을 만드는 조회 쉽게 찾는 시도 변수를 다른 방법 그것은 매우 쉽게 보고 이해하는 범위 및 보고 이해할 유형 그것은 매우 일반적인 스타일과 이해하기 쉽 그것은 전달 FxCop

예제:여기에 몇 가지 예:m_stringCustomerName p_stringCustomerDatabaseConnectionstring intNumberOfCustomerRecords 또는 iNumberOfCustomerRecords 또는 integerNumberOfCustomerRecords 이러한 간단한 규칙을 것입니다 크게 향상시킬 코드의 신뢰성과 관리할 수 있습니다.

제어 구조를 하나의 선 문의 모든 제어 구조(는 경우,동해,etc.) 단일 라인 문은 항상 감싸 중괄호를 매우 쉽기 때문에 추가하는 새로운 문을 깨닫지 않는 주어진 문장 그리고 제어 구조를 분류하는 코드를 논리를 생성하지 않는 모든 컴파일한 시간에 오류가 있습니다.

방법은 예외에 포장 모든 방법으로 감싸 외부 try-를 잡는 트랩,장소를 제공합 복구,확인을 찾아,로그,결정을 던지거나지 않습니다.그것은 예기치 않은 예외는 원인이 우리의 응용 프로그램을 충돌에 의해 감싸는 모든 메서드 트랩핑 처리되지 않은 모든 예외를 우리는 보증을 식별 및 로깅하는 모든 예외하고 우리는지 우리의 응용 프로그램에서 충돌하고 있습니다.그것은 약간의 추가 작업이 더 필요 하지만 결과는 잘 노력이 가치가 있습니다.

들여쓰기 들여쓰기 주요 문제가 되지 않습니다;그러나,네 개의 공백을 사용하지 않는 탭을 제안합니다.만약 코드를 인쇄하고,첫 번째 프린터는 탭을 일반적으로 기본값은 8 공간이 있습니다.다른 개발자가 사용하는 경향이 있 다른 탭 크기입니다.Microsoft 의 코드는 일반적으로 들여쓰기 4 는 공간의 경우 사용하여 Microsoft 코드 및 사용 이외의 다른 공백 4 개,다음 코드는 것이 필요 포맷하는 것.네 공간 쉽고 일관성입니다.

특정 가이드 라인에 따라 코딩하지 않는 경우 실제 M_ 표기법을 계속 사용하고 프로젝트 코딩 가이드 라인이 말하면 변경해야합니다.

기능적이어야합니다.

  • 글로벌 변수를 사용하지 마십시오.
  • 정적 변수를 사용하지 마십시오.
  • 멤버 변수를 사용하지 마십시오.

실제로해야하지만 실제로 필요한 경우에만 하나의 변수를 사용하여 응용 프로그램 / 환경에 액세스하십시오.

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