Android 용 Java에서 모델보기 컨트롤러 패턴을 구현할 수 있습니까?
아니면 이미 활동을 통해 구현 되었습니까? 아니면 Android 용 MVC 패턴을 구현하는 더 좋은 방법이 있습니까?
Android 용 Java에서 모델보기 컨트롤러 패턴을 구현할 수 있습니까?
아니면 이미 활동을 통해 구현 되었습니까? 아니면 Android 용 MVC 패턴을 구현하는 더 좋은 방법이 있습니까?
답변:
Android에는 MVC가 없지만 다음이 있습니다.
보편적으로 독특한 MVC 패턴은 없습니다. MVC는 견고한 프로그래밍 프레임 워크가 아닌 개념입니다. 모든 플랫폼에서 고유 한 MVC를 구현할 수 있습니다. 다음 기본 아이디어를 따르는 한 MVC를 구현하고 있습니다.
모델을 프로그래밍 할 때 모델은 렌더링 (또는 플랫폼 별 코드)에 대해 걱정할 필요가 없습니다. 모델은보기에 말하기를, 렌더링이 Android 또는 iOS 또는 Windows Phone인지 상관하지 않습니다. 이것은 렌더링해야합니다. 뷰는 플랫폼 별 렌더링 코드 만 처리합니다.
플랫폼 간 응용 프로그램을 개발하기 위해 Mono 를 사용 하여 모델을 공유 할 때 특히 유용 합니다.
일부 검색 후 가장 합리적인 답변은 다음과 같습니다.
MVC는 이미 Android에서 다음과 같이 구현되었습니다.
Button
에서 파생 android.view.View
.(이것은 활동에 응용 프로그램 도메인 논리가 없음을 의미합니다.)
소규모 개발자에게 가장 합리적인 것은이 패턴을 따르고 Google이하지 않기로 결정한 것을하지 않는 것입니다.
추신 활동이 때때로 재시작되기 때문에 모델 데이터를위한 장소가 아닙니다 (다시 시작하는 가장 쉬운 방법 android:configChanges="keyboardHidden|orientation"
은 XML에서 생략 하고 기기를 돌리는 것입니다).
편집하다
우리는 MVC 에 대해 이야기하고 있지만 FMVC , Framework--Model--View--Controller 라고 말할 것 입니다. 프레임 워크 (안드로이드 OS)의 구성 요소 라이프 사이클 및 관련 이벤트의 아이디어를 부과하고, 연습에 컨트롤러 ( Activity
/ Service
/ BroadcastReceiver
) 다음에 대처하기위한 우선 책임의입니다 프레임 워크 이벤트 -imposed (예 에서 onCreate ()를 ). 사용자 입력을 별도로 처리해야합니까? 분리해야 할 경우에도 사용자 입력 이벤트도 Android에서 제공됩니다.
어쨌든 안드로이드 전용이 아닌 코드가 적을수록 Activity
/ Service
/ BroadcastReceiver
에 더 좋습니다.
Button
에 대해 아는 아이 ? 뷰 가 표시하는 것만 알고있는 것이 더 논리적으로 보입니다 . Model 이 데이터의 특성에 대해서만 알고 있다는 점을 고려하면 Controller 가 필요한 이유 는 Model 과 View 모두에 대해 알아야합니다 .
Service
컨트롤러의 우산 아래에 있다고 생각합니다
준수 할 수있는 단일 MVC 패턴은 없습니다. MVC는 데이터와 뷰를 혼동해서는 안된다고 다소 언급하고 있습니다. 예를 들어 뷰가 데이터를 보유 할 책임이 있거나 데이터를 처리하는 클래스가 뷰에 직접 영향을 미칩니다.
그럼에도 불구하고 Android가 클래스 및 리소스를 처리하는 방식에 따라 MVC 패턴을 따라야하는 경우도 있습니다. 내 견해로는 때로는 견해를 담당하는 활동이 있지만 그럼에도 불구하고 동시에 컨트롤러 역할을하는 활동이 더 복잡합니다.
XML 파일에서보기 및 레이아웃을 정의하고 res 폴더에서 리소스를로드하고 코드에서 이러한 것들을 혼동하지 않도록하려면 MVC 패턴을 따르십시오.
JDPeckham에 동의하며 XML만으로는 응용 프로그램의 UI 부분을 구현하기에 충분하지 않다고 생각합니다.
그러나 활동을 뷰의 일부로 생각하면 MVC를 구현하는 것이 매우 간단합니다. Activity의 getApplication ()에 의해 리턴 된대로 Application 을 대체 할 수 있으며 여기에서 애플리케이션의 수명 동안 지속되는 컨트롤러를 작성할 수 있습니다.
(또는 응용 프로그램 설명서에서 제안한대로 싱글 톤 패턴을 사용할 수 있습니다)
안드로이드 의 MVC- 아키텍처 모든 MVP를 따르는 것이 낫습니다. 대신 안드로이드의 MVC입니다. 그러나 여전히 질문에 대한 대답에 따르면 이것은 해결책이 될 수 있습니다.
설명 및 지침
Controller -
Activity can play the role.
Use an application class to write the
global methods and define, and avoid
static variables in the controller label
Model -
Entity like - user, Product, and Customer class.
View -
XML layout files.
ViewModel -
Class with like CartItem and owner
models with multiple class properties
Service -
DataService- All the tables which have logic
to get the data to bind the models - UserTable,
CustomerTable
NetworkService - Service logic binds the
logic with network call - Login Service
Helpers -
StringHelper, ValidationHelper static
methods for helping format and validation code.
SharedView - fragmets or shared views from the code
can be separated here
AppConstant -
Use the Values folder XML files
for constant app level
참고 1 :
이제 여기 당신이 할 수있는 마술이 있습니다. 코드를 분류 한 후에는 IEntity 및 IService와 같은 기본 인터페이스 클래스를 작성하십시오. 일반적인 방법을 선언하십시오. 이제 추상 클래스 BaseService를 작성하고 고유 한 메소드 세트를 선언하고 코드를 분리하십시오.
참고 2 : 활동에 코드 / 논리를 작성하는 대신 여러 모델을 제시하는 경우 뷰를 조각으로 나누는 것이 좋습니다. 그렇다면 더 좋습니다. 따라서 앞으로 뷰에 더 많은 모델이 필요하면 조각을 하나 더 추가하십시오.
참고 3 : 코드 분리는 매우 중요합니다. 아키텍처의 모든 구성 요소는 종속 논리가 없어 독립적이어야합니다. 우연히 의존적 인 논리가있는 경우 그 사이에 매핑 논리 클래스를 작성하십시오. 앞으로 도움이 될 것입니다.
레이아웃, 리소스, 활동 및 의도를 사용한 Android UI 생성은 MVC 패턴의 구현입니다. 자세한 내용은 다음 링크를 참조하십시오 -http : //www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
기술:
MVC 패턴은 본질적으로 다음과 같습니다.
MVC의 중요한 기능 : 모델이나 뷰 또는 컨트롤러가 여전히 다른 모델에 영향을 미치지 않도록 수정할 수 있습니다
가장 유용한 간단한 설명은 다음과 같습니다. http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
내가보고 여기에서 읽은 다른 모든 것에서이 모든 것을 구현하면 어려워지고 안드로이드의 다른 부분과 잘 맞지 않습니다.
활동이 다른 리스너를 구현하도록하는 것은 이미 표준 Android 방식입니다. 가장 무해한 방법은 슬라이드가 onClick 및 기타 유형의 작업을 설명하고 여전히 활동에있는 함수로 그룹화하는 것처럼 Java Observer를 추가하는 것입니다.
안드로이드 방식은 활동이 두 가지를 모두 수행하는 것입니다. 싸워도 실제로 코딩을 확장하거나 수행하는 것이 더 쉬워지는 것은 아닙니다.
나는 두 번째 게시물에 동의합니다 . 사람들이 익숙한 방식이 아니라 이미 구현 된 것입니다. 동일한 파일에 있는지 여부에 관계없이 이미 분리되어 있습니다. 다른 언어 및 OS에 적합하도록 별도의 구분을 만들 필요가 없습니다.
여기의 게시물 중 어느 것도 그 질문에 대답하지 않았다는 것이 놀랍습니다. 그것들은 너무 일반적이거나 모호하거나 부정확하거나 안드로이드의 구현을 다루지 않습니다.
MVC에서 보기 계층은 UI (사용자 인터페이스)를 표시하는 방법 만 알고 있습니다. 이를 위해 데이터가 필요한 경우 모델 계층 에서 가져옵니다 . 그러나 View는 모델에게 직접 데이터를 찾도록 요청하지 않고 Controller를 통해 데이터를 찾습니다 . 따라서 컨트롤러 는 모델 을 호출 하여 View에 필요한 데이터를 제공합니다 . 데이터가 준비되면 컨트롤러 는 View 에서 데이터를 모델 에서 가져올 준비가되었음을 알립니다 . 이제 View 는 Model 에서 데이터를 가져올 수 있습니다 .
이 흐름은 다음과 같이 요약 할 수 있습니다.
View 가 Passive MVC 라고도 하는 Controller 를 통해 또는 Active MVC 인 Observable을 등록 하여 Model 의 데이터를 관찰함으로써 Model 의 데이터 가용성에 대해 View 가 알 수 있다는 점은 주목할 가치가 있습니다 .
구현 부분에서 가장 먼저 떠오르는 것 중 하나는 View에 어떤 안드로이드 구성 요소를 사용해야 합니까? Activity
또는 Fragment
?
답은 중요하지 않으며 둘 다 사용할 수 있다는 것입니다. 보기 는 UI와 사용자의 상호 작용 장치와 응답의 사용자 인터페이스 (UI)를 제공 할 수 있어야한다. 모두 Activity
와 Fragment
이에 필요한 방법을 제공합니다.
에서 사용되는 예제 응용 프로그램에서 이 문서 내가 사용한 Activity
에 대한 보기 계층 만 Fragment
사용할 수 있습니다.
완전한 샘플 앱은 여기 GitHub 저장소의 'mvc'브랜치에서 찾을 수 있습니다 .
또한 예를 통해 장점과 안드로이드에서 MVC 아키텍처의 단점 처리 한 여기 .
관심있는 사람들을 위해 안드로이드 앱 아키텍처에 대한 일련의 기사를 시작했습니다. 여기서 완전한 작동하는 앱을 통해 안드로이드 앱 개발을위한 MVC, MVP, MVVM과 같은 다양한 아키텍처를 비교합니다.
안드로이드에서 MVx 재해에 질려서 최근에 단방향 데이터 흐름을 제공하고 MVC의 개념과 유사한 작은 라이브러리를 만들었습니다 : https://github.com/zserge/anvil
기본적으로 구성 요소 (활동, 조각 및 뷰 그룹)가 있습니다. 내부에서 뷰 레이어의 구조와 스타일을 정의합니다. 또한 데이터를 뷰에 바인딩하는 방법을 정의합니다. 마지막으로 동일한 위치에 리스너를 바인딩 할 수 있습니다.
그런 다음 데이터가 변경되면 전역 "render ()"메서드가 호출되고 뷰는 최신 데이터로 현명하게 업데이트됩니다.
다음은 코드 압축을 위해 내부에 모든 것을 포함하는 구성 요소의 예입니다 (물론 모델과 컨트롤러는 쉽게 분리 할 수 있음). 여기서 "count"는 모델이고 view () 메서드는 뷰이고 "v-> count ++"는 버튼 클릭을 수신하고 모델을 업데이트하는 컨트롤러입니다.
public MyView extends RenderableView {
public MyView(Context c) {
super(c);
}
private int count = 0;
public void view() {
frameLayout(() -> { // Define your view hierarchy
size(FILL, WRAP);
button(() -> {
textColor(Color.RED); // Define view style
text("Clicked " + count); // Bind data
onClick(v -> count++); // Bind listeners
});
});
}
분리 된 모델과 컨트롤러를 사용하면 다음과 같습니다.
button(() -> {
textColor(Color.RED);
text("Clicked " + mModel.getClickCount());
onClick(mController::onButtonClicked);
});
여기에서 각 버튼 클릭시 숫자가 증가 한 다음 "render ()"가 호출되고 버튼 텍스트가 업데이트됩니다.
Kotlin ( http://zserge.com/blog/anvil-kotlin.html) 을 사용하면 구문이 더 즐거워집니다 . 또한 람다가없는 Java에 대한 대체 구문이 있습니다.
라이브러리 자체는 매우 가볍고 의존성이 없으며 반사를 사용하지 않습니다.
(면책 조항 : 나는이 도서관의 저자입니다)
구현 된 MVC 아키텍처는 없지만 MVP (model-view-presenter) 아키텍처를 구현하기위한 라이브러리 / 예가 있습니다.
다음 링크를 확인하십시오 :
Google은 Android 아키텍처 MVP의 예를 추가했습니다.
많은 사람들이 MVC가 이미 Android에서 구현되었다고 말하고 있지만 사실이 아닙니다. Android는 기본적으로 MVC를 따르지 않습니다.
Google은 iPhone과 같은 MVC 구현의 제한 사항을 강제로 적용하지 않지만 프로젝트에서 원하는 패턴이나 기술을 원하는 개발자에게 달려 있습니다. 작거나 간단한 응용 프로그램에서는 MVC를 사용할 필요가 없지만 응용 프로그램으로 나중에 자라면서 복잡해지고 코드 수정이 필요한 경우 Android에서 MVC 패턴이 필요합니다.
코드를 쉽게 수정하고 문제를 줄이는 데 도움이됩니다. Android에서 MVC를 구현하려면 아래 주어진 링크를 따라 프로젝트에서 MVC 구현을 즐기십시오.
http://www.therealjoshua.com/2011/11/android-architecture-part-1-intro/
그러나 요즘에는 안드로이드 아키텍처 패턴과 함께 MVP가 개발자가 깨끗하고 강력한 안드로이드 응용 프로그램에 사용해야하는 최고의 옵션 중 하나라고 생각합니다.
MVC, MVVM 또는 Presentation Model 을 Android 앱에 적용 할 때 실제로 원하는 것은 명확한 구조화 된 프로젝트를 가지고 단위 테스트를 위해 더욱 중요하게하는 것입니다.
현재 타사 프레임 워크가 없으면 일반적으로 비즈니스 가치를 추가하지 않는 많은 코드 (addXXListener (), findViewById () 등)가 있습니다.
또한 일반적인 JUnit 테스트 대신 Android 단위 테스트를 실행해야합니다. 단위 테스트를 실행하는 데 시간이 오래 걸리고 다소 비실용적입니다. 이러한 이유로 몇 년 전에 우리 는 안드로이드 플랫폼을위한 데이터 바인딩 프레젠테이션 모델 프레임 워크 인 RoboBinding과 같은 오픈 소스 프로젝트를 시작했습니다 .
RoboBinding을 사용하면 읽기, 테스트 및 유지 관리가 더 쉬운 UI 코드를 작성할 수 있습니다. RoboBinding은 addXXListener 와 같은 불필요한 코드 의 필요성을 제거하고 UI 로직을 POJO 인 프리젠 테이션 모델로 전환하고 일반 JUnit 테스트 를 통해 테스트 할 수 있습니다 . RoboBinding 자체에는 300 개 이상의 JUnit 테스트가 제공되어 품질을 보장합니다.