제 의견으로는 모든 클래스에 대해 파일을 만드는 것이 더 좋습니다. 파일의 이름은 클래스 이름을 따서 지정합니다. 나는 차드 자작 나무보다 약간 다른 표기법, 즉 Classname.class.php
을 사용합니다. 클래스 자동 로딩은 좋은 기능이지만 매우 자주 사용하지는 않습니다 (동일한 유형의 클래스가 자주 추가되거나 제거되는 MVC와 같은 특정 상황에서만).
개체 모델링 : 명사에 대한 클래스를 만들기 시작하십시오. 애플리케이션의 액터를 식별하십시오. 이를 수행하는 방법은 응용 프로그램이 수행해야 할 작업을 기록한 다음 명사를 스캔하고 그 후에 클래스를 모델링하는 것입니다. 클래스는 단일 객체를 나타내므로 클래스 이름은 대부분 단일 시간입니다. 객체가 여러 개인 경우 ObjectCollection 또는 이와 비슷한 이름을 지정해야합니다 (예 : "BookCollection"). 내 책 수집을 추적하는 작은 책 라이브러리 응용 프로그램을 만들려면
:
그것을 시도 할 수 있습니다. 그것은 내가 소유 한 책, 장르, 저자 (들) 그리고 내가 빌려준 친구들을 추적해야합니다. 또한 모든 친구에게 전화 번호를 저장해야하므로 전화 할 수 있습니다. 모든 정보는 데이터베이스에 저장됩니다.
는
Book
:
Collection
책 의 컬렉션을 나타냅니다 : 책 ("대부", "Cryptonomicon")
Library
나타냅니다 이미 라이브러리에 포함을
Genre
("Sci- ("닐 스티븐슨", "마리오 푸조")
Friend
("조", "질", "잭")
PhoneNumber
(친구의 속성)
Database
(대만족)
그런 다음 계층 구조를 구축. 어떤 객체가 다른 객체를 포함하고 있으며, 그 객체 사이의 관계는 어떻게 생겼는가?
Library
는 0, 1 이상 Book
의
Book
는 정확히 하나의 Genre
Book
1 이상 Author
의
- 나는
Book
0 또는 1로 빌려줄 수에 의해 작성 속한 포함 Friend
및 한 번에 하나만 Friend
Friend
은 PhoneNumber
(데이터베이스가 어떻게 표시되는지 알려줄 것입니다.)
모든 것이 분명하지는 않습니다. 전화 번호 수업이 정말로 필요하십니까? 그것은 단지 문자열입니다. 이 경우 속성으로 지정해야합니다. 또한 친구 전화 번호간에 전화 번호가 실제로 공유되지 않습니다 (같은 친구가 함께 사는 여러 친구가 자주 바뀌면 자주 변경되지만, 현재는 다소 과장 될 수 있습니다). 명사가 스칼라 값 (문자열, 정수, 부동 소수점)으로 표현 될 수 있고 다른 값이 연결되어 있지 않으면 클래스를 만드는 것이 과잉 일 수 있습니다.
시간이 지남에 따라 애플리케이션을 확장하십시오. 전화 번호뿐만 아니라 주소도 저장하기로 결정했습니다. 주소와 전화 번호는 매우 유사한 유형의 정보이므로 거리, 도시, 우편 번호 등 다른 변수를 추가하십시오. 어떤 점에서는 Friend
클래스가 거대 해 졌기 때문에 여러 가지 속성, getters 및 setters 메서드가 있으며 그 중 일부는 함께 그룹화하기 위해 접두사가 붙어 있기 때문에 좌절하게됩니다 (Friend->addressStreet
, Friend>addressPostCode
등등). 따라서 Address
(전화 번호를 Friend
으로 남겨둔 경우) 또는 Contact
(코드를 깨끗하게 유지하기 위해)으로 옮길 수 있습니다 (아무 문제가 없지만 조심해야합니다).
클래스 계층 구조 및 개체 계층 구조는 어떻습니까? 그것들을 혼동하지 마라, 그들은 완전히 다른 물건이다! 클래스 계층 구조는 비슷한 클래스가 일부 속성을 공유하지만 다른 클래스에서는 다른 경우에 발생합니다. 따라서 공유하는 속성과 메서드로 하나의 클래스를 만들고 부모 클래스의 속성과 메서드를 상속하고 하위 클래스를 추가하여 차이점을 처리합니다.
예를 들어, 우리 도서관의 예는 무엇입니까? 솔직히 말해서, 나는 조금 말도 안되는 것을 제외하고는 아무것도 생각할 수 없다.하지만 그걸로 가자. ... Friend
s 및 Author
s 모두 Person
s! 둘 다 이름, 전화 번호 및 주소가 있습니다. 그러나 저자는 책을 쓰고 친구도하지 않기 때문에 (또한 저자는 일반적으로 책을 빌리지 않습니다.) 따라서 Name
및 Address
-클래스를 정의 할 수 있지만 getUnreturnedBooks()
은 Friend
에 분명히 속하고 getBooksWritten()
은 Author
에 속합니다.
동일한 실행에서 Author
및 Friend
을 처리하지 않으므로 실제로 이해가되지 않습니다. 그러나 당신이 도서관에 저장된 모든 주소 목록을 필요로한다고 말하면, 당신의 인물을 반복하여 getAddress()
으로 전화 할 수 있습니다. 솔직히 말해서, PHP도 이런 경우에 좋지 않은 예제입니다. 원하는 모든 유형을 배열에 저장하고 원하는 모든 방식으로 액세스 할 수 있지만 가능하지 않은 강력한 형식의 언어로 액세스 할 수 있기 때문입니다. Java에서는 배열에 대한 데이터 유형을 정의해야하며, 상속이 공통된 경우 다른 유형을 저장할 수도 있습니다 (단, 원래 클래스의 메소드에만 제한됨).그 계급의 부도는 충분하지.
개체 계층 구조는 단순히 어떤 개체가 다른 개체를 포함해야 하는지를 나타냅니다. library
에는 book
개체가 포함되어 있습니다. book
에는 author
개체가 포함되어 있습니다.
일부 추가 포인터 :
시도는 설명한다. Library->retrieveValues()
과 같은 이름을 사용하지 마십시오. 대신 개체를 사용하기 때문에 Library->getBooks()
으로 이름을 지정하십시오.
때때로 반환 할 데이터 형식 뒤에 메서드를 명명하는 것이 좋습니다. 그들이 부울을 돌려주는 것은 일반적입니다. 올바른 이름 지정 규칙은 has
이거나 Friend->hasBook($book)
또는 Book->isInLibraryCurrently()
과 같이 is
일 수 있습니다.
특정 클래스의 모든 개체에 대해 항상 동일한 값은 클래스 상수 일 수 있습니다. 말하자면 Person
이 남성이거나 여성이고 데이터베이스에 "m"또는 "f"로 저장하는 경우 클래스 상수 Person::GENDER_MALE = 'm'
및 Person::GENDER_FEMALE = 'f'
을 정의하는 것이 의미가 있으므로 "m"이 없습니다. 와 "f"는 SQL 쿼리에 흩어져 있습니다.
단일 인스턴스 만 생성하는 클래스는 싱글 톤으로 모델링 할 수 있습니다. 이에 대한 좋은 예가 Database 클래스 일 수 있습니다. 한 번에 둘 이상의 트랜잭션을 열 필요가 거의 없습니다. 위키 피 디아 (http://en.wikipedia.org/wiki/Singleton_pattern)에서 싱글 톤에 대해 자세히 알아보십시오.
업데이트 : 어떤 사람들은 당신이 그 (것)들을 이런 식으로 구현하면 더 많거나 적은 "돌에 새겨진"이기 때문에 싱글 톤이, 나쁜 생각 생각합니다. 따라서 데이터베이스 클래스를 싱글 톤으로 모델링했지만 나중에 하나 이상의 데이터베이스 연결이 필요하다고 판단되면 (가능하지만 가능할 수도 있음) 문제가 발생합니다. 위험을 무릅 쓰면 싱글 톤이 편리 할 수 있습니다.
나는 싱글 톤에 대해 논쟁하겠습니다. "있을 법하지 않음"은 가능성이 있음을 의미하므로 그때 당신은 무엇을합니까? Singleton은 소스 코드에서 방황하는 글로벌 심볼이므로 필요에 따라 쉽게 대체 할 수 없기 때문에 안티 패턴입니다. –
+1 좋은 답변과 문제 해결을 위해 시간을 투자하십시오. –
필자는 PHP에서 정적 변수 레지스트리를 위해 싱글 톤을 사용했습니다. 전역 변수를 사용하고 (참조를 매개 변수로 전달하는) 방법으로 사용했습니다. – Ross