2017-12-08 4 views
-2

저는 작은 프로젝트를 만들고 있는데 프로젝트를 디자인하는 방법에 대한 정보를 얻고 싶습니다. 내 사고 방식이 좋든 나쁠지를 알면 더 행복해 질 것입니다. 그리고 그것이 나쁘면 어떻게 나쁜 일이며 어떻게 개선 할 수 있을까요? 클래스 디자인 - 제 접근 방식이 맞습니까?

  • 지역 건물의
  • 번호 : 두 가지 속성이 있습니다

    • 거리 :

      나는 세 가지 클래스가 있습니다.

      • 지도 < 문자열을 가지고
    • 시, 스트리트> - 문자열이
      • 지도 < 문자열을 가지고
    • 나라, StreetName
    • 이며,시> - 문자열 CityName입니다.

나는이 나라의 객체를 비교하는 보고서를 만들려고합니다. 2 개 도시 (다른 국가의 도시)가 동일한 StreetName을 가지고 있는지 동일한 CityName 확인을하면. 동일한 StreetName을 가진 경우 건물의 면적과 수를 비교합니다. 같은 StreetName이 없으면 보고서에 다음과 같이 쓰십시오. "각 도시의 도시 이름은 같지만 한 건물에는 20 개의 건물이 있고 다른 건물에는 55 개의 건물이 있습니다." (건물의 면적과 건물 수가 같은 경우에도 보고서에 내용을 적어주십시오).

  • 3 개 클래스 만들기 :

    이것은 내가 그것을 할 생각 방법입니다 CountryReport, CityReport 및 StreetReport 는

    • CountryReport는 CityReport의 목록을하고 cityCompareReport 방법 (나라를해야합니다 , 국가). cityCompareReport 메소드는 2 개 국가를 받아 들일 수 있으며, 동일한 CityName을 갖는 경우 CityReport 객체를 생성하고 해당 도시를 비교합니다.
    • CityReport에는 StreetReport 목록이 있으며 streetCompareReport (City, City) 메소드가 있습니다. streetCompareReport() 메소드는 2 개의 Cities를 받아 들일 것이고, 이것들이 동일한 StreetName을 가지면 StreetReport의 객체를 생성하고 그 거리를 비교합니다.
    • StreetReport는 건물의 면적과 건물 수를 비교하고 적합한 보고서를 제공합니다.

그것을 할 수있는 올바른 방법이 있다면 알려 내가 잘못 않은 경우 알려 주시기 바랍니다하지 않을 경우 (내가 :) 배우고 싶은) 주시기 바랍니다.

+0

프로젝트에 대해 더 많이 알지 못하면 디자인이 좋은지 아닌지를 말하기가 정말 어렵습니다. 예를 들어, Java에서 알고리즘을 작성하는 능력을 테스트중인 학교 과제입니까? 데이터를 어디에서 가져 왔습니까? 실제 프로젝트에서 필자는 모든 데이터를 데이터베이스에 저장하고 쿼리를 사용하여 원하는 데이터를 얻을 수 있습니다. – StriplingWarrior

답변

3

우선, 실제 데이터를 처리해야한다면 https://www.mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses/을 읽고 열심히 생각하는 것이 좋습니다.

실생활에서 나는 이런 종류의 것을 추상화하지 말 것을 강력히 권장합니다. 문제를 여러 번 해결할 때까지는 좋은 추상화에 부딪치게 될 것 같지 않습니다. 그래서 생각을 잠그지 마십시오.

물론 이것은 아마도 클래스 용입니다. 선생님이 원하는대로하십시오. 선생님이 클래스 정의를 수행 할 수 있는지 확인하려면 많은 클래스 정의가 필요합니다. 실제로 이것이 좋은 코딩 스타일이 아니라는 것을 머리 뒤쪽의 어딘가에서 알아 내려고 노력하십시오.

그렇다면 다른 사람들이 이러한 문제를 어떻게 해결했는지 살펴 보시기 바랍니다. 예를 들어 https://developers.google.com/places/web-service/details은 Google이 제시 한 실제 솔루션을 보여줍니다. Google이 내부적으로 수행하는 작업은 해당 데이터 구조를 프로토콜 버퍼 (예 : https://developers.google.com/protocol-buffers/ 참조)로 정의하여 JSON, XML 등의 직렬화 논리뿐만 아니라 Java를 비롯한 여러 언어에 대한 코드를 자동으로 생성 할 가능성이 높습니다.

address_components의 가능한 각 구성 요소에 대해 각 클래스를 호출하는 코드를 작성하는 대신 보너스로 유형별로 구성 요소를 정렬 한 다음이를 비교하는 간단한 루프를 작성할 수 있습니다. 코드가 적다. 반복되는 매우 유사한 코드가 좋지 않습니다.

1

일반적으로 모든 클래스에 자신을 나타내는 데 필요한 모든 특성을 부여하는 것이 좋습니다. 따라서 거리에는 이름이 있으며 지역에 속하며 여러 건물이 있습니다. 도시에는 거리가 있습니다. Streets는 Street 인스턴스 목록을 나타내는 객체이며 Street에 액세스하는 방법에 대한 지식을 포함합니다. 그것은 내부적으로 Street.name()에 대한 접근을 쉽게 할 수있는 Map을 사용할 수도 있지만 그것이 구현하는 방법은 외부 클래스에 대한 "블랙 박스"입니다. City 인스턴스에 대한 지식이있는 객체 인 Cities가 포함되어 있으므로 Country에 대해서도 마찬가지입니다. 이제 올바른 위치에서 행동을 취할 수 있습니다. 어떤 기능을 담당 할 책임자가 누구인지 물어보십시오.

국가 Comparable 및 City를 자체 구현으로 만들 수 있습니다. 그렇게하면 당신이 속한 곳에서 모든 책임을지게 될 것입니다.

관련 문제