Android의 MVC 패턴
Android 용 Java에서 모델보기 컨트롤러 패턴을 구현할 수 있습니까?
아니면 이미 활동을 통해 구현 되었습니까? 아니면 Android 용 MVC 패턴을 구현하는 더 좋은 방법이 있습니까?
Android에는 MVC가 없지만 다음이 있습니다.
- 해상도, 하드웨어 등에 따라 다양한 XML 파일로 사용자 인터페이스 를 정의합니다 .
- 로케일 등으로 다양한 XML 파일에서 자원 을 정의합니다 .
- ListActivity , TabActivity 와 같은 클래스를 확장 하고 인플레이터로 XML 파일을 사용합니다 .
- 비즈니스 로직에 대해 원하는만큼 클래스를 작성할 수 있습니다.
- 많은 Utils 가 이미 작성되었습니다 -DatabaseUtils , Html.
보편적으로 독특한 MVC 패턴은 없습니다. MVC는 견고한 프로그래밍 프레임 워크가 아닌 개념입니다. 모든 플랫폼에서 고유 한 MVC를 구현할 수 있습니다. 다음 기본 아이디어를 따르는 한 MVC를 구현하고 있습니다.
- 모델 : 렌더링 대상
- 보기 : 렌더링 방법
- 컨트롤러 : 이벤트, 사용자 입력
모델을 프로그래밍 할 때 모델은 렌더링 (또는 플랫폼 별 코드)에 대해 걱정할 필요가 없습니다. 모델은보기에 말하기를, 렌더링이 Android 또는 iOS 또는 Windows Phone인지 상관하지 않습니다. 이것은 렌더링해야합니다. 뷰는 플랫폼 별 렌더링 코드 만 처리합니다.
플랫폼 간 응용 프로그램을 개발하기 위해 Mono 를 사용 하여 모델을 공유 할 때 특히 유용 합니다.
Android의 조치,보기 및 활동은 Android UI를 사용하는 기본 방식이며 모델-뷰-모델 (MVVM) 패턴 의 구현입니다. 이는 모델-뷰 와 동일한 패밀리에서 모델-뷰와 유사합니다. -제어 장치.
내가 아는 한,이 모델에서 벗어날 수있는 방법은 없습니다. 아마도 가능할 수도 있지만 기존 모델의 모든 이점을 잃을 수도 있고 UI 레이어를 다시 작성해야 작동 할 수도 있습니다.
일부 검색 후 가장 합리적인 답변은 다음과 같습니다.
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
에 더 좋습니다.
준수 할 수있는 단일 MVC 패턴은 없습니다. MVC는 데이터와 뷰를 혼동해서는 안된다고 언급하고 있으므로 뷰가 데이터를 보유 할 책임이 있거나 데이터를 처리하는 클래스가 뷰에 직접 영향을 미칩니다.
그럼에도 불구하고 Android가 클래스 및 리소스를 처리하는 방식에 따라 MVC 패턴을 따라야하는 경우도 있습니다. 내 견해로는 때로는 견해를 담당하는 활동이 있지만 그럼에도 불구하고 동시에 컨트롤러 역할을하는 활동이 더 복잡합니다.
XML 파일에서보기 및 레이아웃을 정의하고 res 폴더에서 리소스를로드하고 코드에서 이러한 것들을 혼동하지 않도록하려면 MVC 패턴을 따르십시오.
Android에서 MVC를 구현할 수 있지만 "기본적으로 지원되지"않으며 약간의 노력이 필요합니다.
즉, 개인적으로 안드로이드 개발을위한 훨씬 깨끗한 아키텍처 패턴 으로 MVP 를 선호 합니다. 그리고 MVP라고 말하면 이것이 의미합니다.
또한 여기에 자세한 답변을 게시했습니다 .
Android에서 MVC / MVP 구현에 대한 다양한 접근 방식을 사용한 후 합리적인 아키텍처 패턴 을 찾았 습니다.이 게시물 에서는 Android의 MVP 및 MVC 아키텍처 패턴에 대해 설명했습니다 .
Android에서 MVC를 구현하는 가장 좋은 리소스는 다음 게시물입니다 .
나는 내 프로젝트 중 하나에 대해 동일한 디자인을 따랐으며 훌륭하게 작동했습니다. 저는 안드로이드 초보자이므로 이것이 최선의 해결책이라고 말할 수는 없습니다.
하나의 수정을했습니다. 가로 세로 모드가 변경 될 때 다시 만들지 않도록 응용 프로그램 클래스의 각 활동에 대한 모델과 컨트롤러를 인스턴스화했습니다.
JDPeckham에 동의하며 XML만으로는 응용 프로그램의 UI 부분을 구현하기에 충분하지 않다고 생각합니다.
그러나 Activity를 뷰의 일부로 생각하면 MVC를 구현하는 것이 매우 간단합니다. 액티비티의 getApplication ()에 의해 리턴 된대로 Application 을 대체 할 수 있으며 여기에서 애플리케이션의 수명 동안 지속되는 컨트롤러를 작성할 수 있습니다.
(또는 응용 프로그램 설명서에서 제안한대로 싱글 톤 패턴을 사용할 수 있습니다)
레이아웃, 리소스, 활동 및 의도를 사용한 Android UI 생성은 MVC 패턴의 구현입니다. 자세한 내용은 다음 링크를 참조하십시오 -http : //www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
안드로이드 의 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의 MVC 패턴은 어댑터 클래스로 구현됩니다 . 컨트롤러를 "어댑터"로 바꿉니다. 어댑터 상태에 대한 설명 :
Adapter 오브젝트는 AdapterView와 해당보기의 기본 데이터 사이의 브릿지 역할을합니다.
데이터베이스에서 읽는 Android 응용 프로그램을 찾고 있습니다. 아직 잘 작동하는지 모르겠습니다. 그러나 Qt의 Model-View-Delegate 아키텍처와 비슷해 보이는데, 이는 전통적인 MVC 패턴에서 한 단계 향상되었다고 주장합니다. 적어도 PC에서는 Qt의 패턴이 상당히 잘 작동합니다.
이 게시물은 오래된 것 같지만 Android에 대한이 분야의 최근 개발에 대해 알리기 위해 다음 두 가지를 추가하고 싶습니다.
android- binding-안드로이드 뷰 위젯을 데이터 모델에 바인딩하는 프레임 워크를 제공합니다. 안드로이드 응용 프로그램에서 MVC 또는 MVVM 패턴을 구현하는 데 도움이됩니다.
roboguice -RoboGuice는 개발 과정에서 추측을 제거합니다. View, Resource, System Service 또는 기타 개체를 주입하고 RoboGuice가 세부 정보를 처리하도록합니다.
MVC (모델 뷰 컨트롤러)
기술:
- 소프트웨어 개발에서 대규모 프로젝트를 수행해야하는 경우 MVC는 프로젝트를 구성하는 보편적 인 방법이기 때문에 일반적으로 사용됩니다.
- 새로운 개발자는 프로젝트에 빠르게 적응할 수 있습니다
- 대규모 프로젝트 개발과 플랫폼 간 개발에도 도움이됩니다.
MVC 패턴은 본질적으로 다음과 같습니다.
- 모델 : 표시 대상 이것은 데이터 소스가 될 수 있습니다 (예 : 앱의 서버, 원시 데이터)
- 보기 : 표시 방법 이것은 xml 일 수 있습니다. 따라서 프리젠 테이션 필터 역할을합니다. 뷰는 해당 모델 (또는 모델 부분)에 첨부되며 프리젠 테이션에 필요한 데이터를 가져옵니다.
- 컨트롤러 : 사용자 입력과 같은 이벤트 처리 이것은 활동이다
MVC의 중요한 기능 : 모델이나 뷰 또는 컨트롤러가 여전히 다른 모델에 영향을 미치지 않도록 수정할 수 있습니다
- 뷰의 색상, 뷰의 크기 또는 뷰의 위치를 변경한다고 가정합니다. 그렇게해도 모델이나 컨트롤러에 영향을 미치지 않습니다
- 서버에서 가져온 데이터 대신 에셋에서 데이터를 가져 오는 대신 모델을 변경해도 뷰 및 컨트롤러에 영향을 미치지 않습니다.
- 컨트롤러 (활동의 논리)를 변경하면 모델과보기에 영향을 미치지 않습니다.
가장 유용한 간단한 설명은 다음과 같습니다. http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
내가보고 여기에서 읽은 다른 모든 것에서이 모든 것을 구현하면 어려워지고 안드로이드의 다른 부분과 잘 맞지 않습니다.
활동이 다른 리스너를 구현하도록하는 것은 이미 표준 Android 방식입니다. 가장 무해한 방법은 슬라이드에 설명 된 것처럼 Java Observer를 추가하고 onClick 및 기타 유형의 작업을 여전히 활동에있는 함수로 그룹화하는 것입니다.
안드로이드 방식은 활동이 두 가지를 모두 수행한다는 것입니다. 싸워도 실제로 코딩을 확장하거나 수행하는 것이 더 쉬워지는 것은 아닙니다.
나는 두 번째 게시물에 동의합니다 . 사람들이 익숙한 방식이 아니라 이미 구현 된 것입니다. 동일한 파일에 있는지 여부에 관계없이 이미 분리되어 있습니다. 다른 언어 및 OS에 맞게 별도의 구분을 만들 필요가 없습니다.
안드로이드에서 MVx 재해에 질려서 최근에 단방향 데이터 흐름을 제공하고 MVC의 개념과 유사한 작은 라이브러리를 만들었습니다 : https://github.com/zserge/anvil
기본적으로 구성 요소 (활동, 조각 및 뷰 그룹)가 있습니다. 내부에서 뷰 레이어의 구조와 스타일을 정의합니다. 또한 데이터를 뷰에 바인딩하는 방법을 정의합니다. 마지막으로 동일한 위치에 리스너를 바인딩 할 수 있습니다.
그런 다음 데이터가 변경되면 전역 "render ()"메서드가 호출되고 뷰는 최신 데이터로 스마트하게 업데이트됩니다.
다음은 코드 압축을 위해 내부에 모든 것을 포함하는 구성 요소의 예입니다 (물론 Model과 Controller는 쉽게 분리 할 수 있습니다). 여기서 "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 ()"가 호출되고 버튼 텍스트가 업데이트됩니다.
: 당신이 코 틀린 사용하는 경우 구문은보다 쾌적한하게 http://zserge.com/blog/anvil-kotlin.html을 . 또한 람다가없는 Java에 대한 대체 구문이 있습니다.
라이브러리 자체는 매우 가볍고 의존성이 없으며 반사를 사용하지 않습니다.
(면책 조항 : 나는이 도서관의 저자입니다)
여기의 게시물 중 어느 것도 그 질문에 대답하지 않았다는 것이 놀랍습니다. 그것들은 너무 일반적이거나 모호하거나 부정확하거나 안드로이드의 구현을 다루지 않습니다.
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 아키텍처의 단점 처리 한 여기 .
관심있는 사람들을 위해 Android 앱 아키텍처에 대한 일련의 기사를 시작했습니다. 여기서 완전한 작동하는 앱을 통해 안드로이드 앱 개발을위한 MVC, MVP, MVVM과 같은 다른 아키텍처를 비교합니다.
Xamarin 팀이 설명 한 설명 에 따르면 (iOS MVC에서 "이상한 것 같지만 잠시 기다립니다").
- 모델 (데이터 또는 응용 프로그램 논리)
- 보기 (사용자 인터페이스)
- 컨트롤러 (코드 숨김)
나는 이것을 말할 수 있습니다 :
Android의 모델은 단순히 소포 가능 객체입니다. 보기는 XML 레이아웃이고 컨트롤러는 (활동 + 해당 조각)입니다.
* 이것은 단지 나의 의견이며, 어떤 자원이나 책이 아닙니다.
구현 된 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가 개발자가 깨끗하고 강력한 안드로이드 응용 프로그램에 사용해야하는 최고의 옵션 중 하나라고 생각합니다.
When we apply MVC, MVVM, or Presentation Model to an Android app, what we really want is to have a clear structured project and more importantly easier for unit tests.
At the moment, without a third-party framework, you usually have lots of code (like addXXListener(), findViewById(), etc.), which does not add any business value.
What's more, you have to run Android unit tests instead of normal JUnit tests, which take ages to run and make unit tests somewhat impractical. For these reasons, some years ago we started an open source project, RoboBinding - A data-binding Presentation Model framework for the Android platform.
RoboBinding helps you write UI code that is easier to read, test and maintain. RoboBinding removes the need of unnecessary code like addXXListener or so, and shifts UI logic to Presentation Model, which is a POJO and can be tested via normal JUnit tests. RoboBinding itself comes with more than 300 JUnit tests to ensure its quality.
In my understanding, the way Android handles the MVC pattern is like:
You have an Activity, which serves as the controller. You have a class which responsibility is to get the data - the model, and then you have the View class which is the view.
When talking about the view most people think only for its visual part defined in the xml. Let's not forget that the View also has a program part with its constructors, methods and etc, defined in the java class.
참고 URL : https://stackoverflow.com/questions/2925054/mvc-pattern-on-android
'Programing' 카테고리의 다른 글
PHP 배열을 다른 배열로 복사하는 기능이 있습니까? (0) | 2020.02.13 |
---|---|
파이썬으로 날짜를 지정하여 요일을 어떻게 알 수 있습니까? (0) | 2020.02.13 |
파이썬을 사용하여 문자열의 각 문자를 반복 (0) | 2020.02.13 |
파이썬 모듈과 파이썬 패키지의 차이점은 무엇입니까? (0) | 2020.02.13 |
JavaScript에서 이벤트를 트리거하는 방법은 무엇입니까? (0) | 2020.02.13 |