2014-07-14 4 views
0

먼저이 코드가 작동합니다. 기본적으로 if 문을 사용하여 listview에서 클릭 한 위치를 확인한 다음 적절한 텍스트를 표시하기 위해 드로어 블을 비교하는 다른 검사를 실행합니다 (사용자가 개구리 이미지를 클릭하면 EditText 필드가 채워집니다 텍스트 "개구리"와 함께). 내가 가진 한 가지 중요한 문제는 이미지가 무작위 이미지라는 것입니다. 궁극적으로이 괴물 조각으로 안내하게되었습니다. 첫 번째 위치에 대한 검사입니다if 문을 비효율적으로 사용 - Android

if(position==0) { 

    if (username.getDrawable().getConstantState().equals(getResources().getDrawable(R.drawable.image06).getConstantState())) { 
      Toast.makeText(ChatRoom2.this, "Key", Toast.LENGTH_LONG) 
         .show(); 
      String next = "<font color='#13b602'>@Key </font>"; 
      editText.append(Html.fromHtml(next)); 

      editText.setSelection(editText.getText().length()); 
    } if (username.getDrawable().getConstantState().equals(getResources().getDrawable(R.drawable.image03).getConstantState())) { 

      String next = "<font color='#13b602'>@BlueCube</font>"; 
      editText.setText(Html.fromHtml(next)); 

      editText.setSelection(editText.getText().length()); 
    } 
} 

, 2 개 개의 이미지 만이 중첩 된 IFS - 내가 확인하기 30 개 이미지, 각각의 위치 (30)의 경우는 문, 10 개 위치를했을 수 있습니다. 나는이 문제에 대한 나의 해결책이 매우 가난하다는 느낌을 가지고있다. 간단히 작동시키기 위해 500 라인 이상의 코드를 만들어야하기 때문이다. if 문만 포함하는 별도의 클래스를 만드는 방법이 있습니까?

+1

만약'image01, image02, ... imageN'과 같은 반복 변수가 있다면'image [1]','image [2]'등등을 할 수 있도록 배열을 사용할 것을 고려해야합니다. ... 반복하는 것은 사소한 것입니다. –

+0

그래도 그 변경으로 if 문이 많이 필요할 것입니다 ... – ZombiePartie

+0

네,하지만 모든 규칙을 메서드 포인터에 넣을 수 있습니다. 'obj-> image [i] -> do_your_thing();'. –

답변

1

그래서 안드로이드로 코드를 작성하지 않아도 코드가 무엇을하고 있는지 정확히 알 수는 없지만 내가 따라 다니는 패턴을 인식하고 디자인에 결함이 있음을 인식하는 것이 옳습니다.

당신이 따르는 해법은 많은 코드 복제를 야기하는데, 이는 좋은 Object Oriented 사례를 따를 경우 제거 될 수 있습니다.

1) 클래스와 메소드를 사용하여 작업을 구분하십시오. 예를 들어 하나의 클래스에 모든 액션을 포함 할 수 있도록 계속해서이 if 문을 호출합니다. 이러한 유형의 "기본"방법론은 절차 적 프로그래머가 생각하는 방식에 더 가깝습니다. 볼 수 있듯이 많은 문제를 야기 할 수 있습니다. 대신 고유 한 동작을 자체 클래스 또는 메서드로 분할 한 다음 필요할 때 호출하십시오. 예를 들어 중복 된 If 절을 모두 하나의 메서드에 넣으면 한 번 나열 될 수 있지만 여러 번 호출 할 수 있습니다. 그것.

2) 데이터 구조를 올바르게 사용하십시오. 반복되는 위치 지정과 할당 된 텍스트가있는 이미지에 대해 언급합니다. 데이터 구조 (예 : 해시 맵) 또는 객체 (데이터 구조를 변수로 포함 할 수 있음) 용으로 특별히 고안된 클래스에 저장하려는 모든 정보. 예를 들어 반환 할 수있는 특정 텍스트 변수가있는 Image 클래스를 만들 수 있습니다. 그런 다음 이미지에 데이터를로드하고 각 텍스트에 적절한 텍스트를 할당 할 수 있습니다 (이러한 값을 하드 코딩하는 것이 아니라). 또는 위치 클래스의 position 클래스에 위치 값의 가능한 ArrayList가있어, 필요할 때마다 재사용 할 수 있도록 세로로 지정할 수 있습니다.

3) 실제로 나열된 세부 로직이 공통된 요소가있는 경우 일련의 If/Then 문과 대조적으로 switch statement을 사용해보십시오. 이것은 더 깨끗하고 많은 if 절에서 발견 될 수있는 중복을 줄입니다.

당신의 디자인이 추악하다고 생각한다면 ... 더 좋게 만드는 방법이있을 것입니다. 밖에있는 최상의 코드조차도 일반적으로 중복을 제거하고 성능을 향상 시키도록 최적화 할 수 있습니다. 디자인을 최적화하는 방법에 대한 추가 아이디어는 design patterns을 확인하십시오.

희망 하시겠습니까?

+0

그래, 내가 방법을 만들어야한다는 것을 알았지 만 모든 문제는 onItemClickListener 내부에서 발생하므로 변수가 onItemClickListener 내에 있기 때문에 그 밖의 메서드를 만들 수 없습니다. 검색 중이지만 아직 onItemClickListener 내에 메소드를 만드는 방법을 찾을 수 없습니다. – ZombiePartie

+0

MVP와 MVC (http://stackoverflow.com/questions/2056/what-are-mvp-and-mvc-and-what-is-the-difference)를 살펴볼 수도 있습니다. 이러한 패턴은 귀하의 UI 레이어에서 논리. onItemClickListener에 익숙하지 않지만 비즈니스 로직을이 메소드에서 분리 할 수 ​​없다고 믿는 데 어려움을 겪고 있습니다. UI 외부에서 전체 시스템을 구축 한 다음 유닛 테스트 케이스처럼 수신기 내부에서 적절한 메소드를 호출 할 수 있어야합니다. – DanK

0

이 클리너를 얻으려면 for 루프 안에 do-while 루프가 필요하다는 것을 알았습니다!