2011-11-22 5 views
3

이 질문은 일반적인 질문이지만, 구체적인 예를 들어 설명하겠습니다.Android - 활동 간 중복 코드를 피하는 방법

저는 앱에서 많은 활동을하고 있습니다. 모든 활동에는 Facebook 버튼이 있습니다. 버튼을 클릭하면 특정 Facebook 페이지로 이동합니다. 버튼이 모든 페이지에서 똑같은 방식으로 작동하기를 바랍니다.

지금 당장, 모든 활동에서 페이스 북 버튼에 onClickListener()을 작성하고 인 텐트를 만들고 활동을 시작합니다. 모든 활동에서 동일한 코드입니다.

이 코드를 한 번 작성하고 여러 활동에 포함시키는 가장 좋은 방법은 무엇입니까? 어쨌든 다른 .java 파일이 있습니까?

내가 아는 한 가지 해결책은 기본 CustomActivity을 확장하여 Activity으로 확장 한 다음 모든 작업을 CustomActivity까지 확장하는 것입니다. 그런 다음 내 onClickListener() 코드를 CustomActivity에 넣으십시오. 나는 Java에 익숙하지 않았지만 이것이 최선의 접근 방법인지 아닌지 확실하지 않았습니다. 내 활동 중 일부는 이미 다른 사용자 정의 활동 클래스를 그대로 확장하므로 더 많은 일을 확장하는 일이 다소 지저분해질 수 있습니다.

여기에 악마의 옹호를 재생

UPDATE

: 나는이 상속 경로로 가서 내가 내 활동 확장 할 몇 가지 CustomActivity를 만들 말할 수 있습니다. CustomActivity에는 페이스 북 버튼 기능을 포함하여 모든 활동에 사용해야하는 일반 코드가 포함되어 있습니다. CustomActivity에서 일반 코드를 사용해야하는 활동이 있지만 특정 활동에 Facebook 단추가없는 경우 어떻게됩니까?

답변

5

일반적인 기본 클래스가 가장 좋은 방법 일 수 있습니다. 일부 액티비티가 Activity를 확장하고 Activity 하위 클래스 (ListActivity 등)를 확장하는 경우 꽤 잘 작동하지 않습니다.

다른 방법은 클릭 리스너의 로직을 구현하는 별도의 클래스를 만드는 것입니다. — 각 액티비티는 여전히 수신기를 인스턴스화하고 등록해야하지만 —을 수행해야하지만 수행 할 논리는 수신기 클래스에 한 번만 작성하면됩니다.

두 가지 방법 중 하나를 선택하는 것이 좋습니다. 버튼에 속성을 추가하면 클릭 리스너를 등록 할 필요가 없으므로 각 작업에 타겟 메서드를 구현하면됩니다. 그는 기초 수업 방식입니다.

업데이트는 상속 경로를 이동하고 더 페이스 북 버튼으로 활동을한다고 가정. 기법을 사용하는 경우 아무 버튼도 onClick 메서드를 호출하지 않으므로 — 코드에서 다른 작업을 수행 할 필요가 없습니다.이 메서드는 아무 것도하지 않고 그냥 앉아있을 것입니다. 코드에 OnClickListener를 설치하는 경우 청취자를 등록하기 전에 버튼이 존재하는지 테스트해야합니다 (즉, findViewById()null을 반환하지 않았습니다).

+0

업데이트 된 질문 –

+0

@Jakobud - 업데이트 된 답변 –

+0

흥미로운 접근 방식. 감사! –

3

글쎄, 확장 작업은 OOP의 원칙이므로, 하나 이상의 서브 클래스 레벨을 가지는 것이 문제라고 생각하지 않습니다. 내 생각에 당신이 생각한 해결책이 최고입니다.

0

물론입니다. 상속을 사용하여 OOP를 사용해야하는 것처럼 재사용 성을 확보하십시오. 진행 상황에 따라 FB 버튼에 대한 onClickListener보다 더 복잡한 작업 활동에서 재사용하고 싶은 것들이 점점 많아 질 것입니다. 따라서 빌드를 시작하는 것이 좋습니다. 당신이 상속 할 수있는, 재사용 가능한 "슈퍼"활동.

5

일반적으로 일반적인 기본 클래스가 최선의 방법은 아닙니다 (확실히 유효하지만).

이것은 나를 괴롭 히기 위해 잠시 동안 (내가 알고있는 OO를 "얻는"모든 OO 프로그래머) 필요했지만 가능한 한 아껴서 상속을 사용해야합니다. 당신이 그것을 할 때마다 당신은 정말로 이것을 할 수있는 다른 방법이 없다면 스스로에게 물어야합니다.

"is-a"테스트에서 매우 엄격해야합니다. 기본 활동을 "Facebook 활동"이라고 부르면 각 어린이가 Facebook 활동 인 것으로 실제로 말할 수 있습니까? 아마도 그렇지 않습니다. 또한 일부 페이지에 Twitter를 추가하기로 결정한 경우 (다른 사람이 아닌 경우) 어떻게해야합니까?

상속이 완전히 해제되었습니다! 훌륭한 솔루션은 페이스 북 활동을 시작하고 페이스 북 버튼이라고 부르는 컨트롤을 확장하여 페이스 북에 연결하는 데 필요한 모든 것을 캡슐화 할 수 있습니다. 이제이 페이지를 드래그하여 원하는 페이지에 추가 할 수 있습니다 (안드로이드 도구를 사용하면 팔레트에 새 구성 요소를 추가 할 수 있습니다). 활동 수업을 연장하는 것과 같이 "무료"는 아니지만, 장기적으로 볼 때 스트레스가 적게 듭니다.

당신은 아마 지금 나를 믿지 않을 것입니다. 우리 모두는 우리 자신의 경험에서 배워야 할 필요가 있습니다. 이것을 염두에 두어 시간이 지남에 따라 코드를 평가할 때 사용하십시오. 그냥 모든 클래스에 추가 할 수 있도록 최소한으로 그것을 얻을 -

--edit는 의견 당신은 당신이 그것을 자신의 클래스를 많이 사용합니다 생각되는 페이스 북의 활동을 캡슐화 할 수

을 response-- 한 - 라이너.

그러나 언젠가는 너무 많은 상용구라고 생각할 수도 있습니다. 완전히 이해합니다. 그 시점에서 당신은 당신이 제안한 것과 같은 추상적 인 기본 활동을 사용할 수는 있지만, 페이스 북을 명시 적으로 다루기 위해 하드 코딩하지는 않을 것입니다. 대신 페이스 북 (및 다른 사람들)과 같은 행동을 지원하고 이것들을 켜십시오. 행동을 원하는대로. 원한다면 주어진 화면에 페이스 북 동작을 추가하지 말고, 트위터에 추가하십시오.

super(DISABLE_FACEBOOK_BEHAVIOR); 
:

는 "표준"기능을 원하는 경우 예를 들어,이 보일러 최소 할 수

, 당신은 당신이 당신의 생성자를 시작할 수있는 페이스 북을 해제하고자하는 경우, 특별한 아무것도 할 필요가 없습니다

당신은 또한 트위터 사용자가 사용할 수있게 한하려는 경우 : AbstractAction로 (BehaviorEnum ... 행동) 같은 생성자를

super(DISABLE_FACEBOOK_BEHAVIOR, ENABLE_TWITTER_BEHAVIOR); 

합니다.

이것은보다 융통성이 있으며, 귀하의 활동이 명확한 양심으로 행동 활동 IS-A 인 경우 각각이 실제로 가능하다고 말할 수 있습니다.

처음에는 리팩터링을하고 나중에 필요할 때 리팩터링하는 것이 완벽하게 좋은 방법입니다. 상속 모델에 대한주의를 기울여야 문제가 발생하므로, 너를 고치기 전에 너를 너무 오랫동안 엉망으로 만들지 마라.

+0

좋은 지적이 있습니다. 처음에는 상속 문제에 관심이있었습니다. 왜냐하면 어떤 액티비티에 Facebook 버튼이 없지만 여전히'FacebookActivity' 클래스의 다른 측면을 사용해야 할 때 ... –