안드로이드 개발에서 탄탄한 원칙을 구현합니다

Date:

작문 소프트웨어는 생성 행위이며 Android 개발도 예외는 아닙니다. 그것은 단순히 무언가를 만드는 것 이상입니다. 시간이 지남에 따라 성장하고, 적응하고, 관리 할 수있는 응용 프로그램 설계에 관한 것입니다.

수많은 건축 문제에 직면 한 안드로이드 개발자로서, 나는 탄탄한 원칙을 고수하면 가장 엉킨 코드베이스조차도 깨끗한 시스템으로 변형 될 수 있음을 발견했습니다. 이는 추상 원칙이 아니라 강력하고 확장 가능하며 유지 관리 가능한 코드를 작성하는 결과 지향적이고 재현 가능한 방법입니다.

이 기사는 실제 사례, 실용적인 기술 및 Meta WhatsApp 팀의 경험을 통해 Android 개발에 견고한 원칙을 적용 할 수있는 방법에 대한 통찰력을 제공합니다.

견고한 원칙을 이해합니다

Robert C. Martin이 제안한 견고한 원칙은 깨끗하고 효율적인 소프트웨어 아키텍처를 보장하는 객체 지향 프로그래밍을위한 5 가지 설계 원칙입니다.

  • 단일 책임 원칙 (SRP) : 수업에는 변경해야 할 이유가 하나만 있어야합니다.
  • 오픈/폐쇄 원리 (OCP) : 소프트웨어 엔티티는 확장을 위해 열려 있어야하지만 수정을 위해 닫아야합니다.
  • Liskov 대체 원리 (LSP) : 하위 유형은 기본 유형을 대체 할 수 있어야합니다.
  • 인터페이스 분리 원리 (ISP) : 인터페이스는 클라이언트 별이어야하며 사용하지 않은 방법의 구현을 강요해서는 안됩니다.
  • 의존성 반전 원리 (DIP) : 높은 수준의 모듈은 저수준 모듈이 아닌 추상화에 따라 달라야합니다.

이러한 원칙을 Android 개발에 통합함으로써 확장, 테스트 및 유지하기 쉬운 응용 프로그램을 만들 수 있습니다.

단일 책임 원칙 (SRP) : 책임을 간소화합니다

단일 책임 원칙은 유지 관리 가능한 코드를 작성하는 기초입니다. 각 클래스는 책임이있는 단일 우려가 있어야한다고 명시합니다. 일반적인 방지 방지는 활동이나 조각이 UI 렌더링에서 시작하여 책임을 처리 한 다음 데이터 가져 오기, 오류 처리 등을 처리하는 “신의 계급”으로 간주하는 것입니다.이 접근법은 테스트 및 유지 보수 악몽을 만듭니다.

SRP를 사용하면 다른 문제를 다른 구성 요소로 별도로 별도로 설명하십시오. 예를 들어 뉴스 앱에서 뉴스를 만들거나 읽으십시오.

class NewsRepository {    fun fetchNews(): List {        // Handles data fetching logic    }}class NewsViewModel(private val newsRepository: NewsRepository) {    fun loadNews(): LiveData {        // Manages UI state and data flow    }}class NewsActivity : AppCompatActivity() {    // Handles only UI rendering}

모든 수업에는 단 하나의 책임이 있습니다. 따라서 부작용없이 테스트하고 수정하기가 쉽습니다.

최신 Android 개발에서 SRP는 주로 JetPack을 사용하는 권장 아키텍처와 함께 구현됩니다. 예를 들어, 데이터 조작 로직과 관련된 논리는 ViewModel 내부에 상주 할 수 있지만 활동이나 조각은 UI 및 상호 작용에 관심이 있어야합니다. 데이터 가져 오기는 객실과 같은 로컬 데이터베이스 또는 Retrofit과 같은 네트워크 계층에서 별도의 리포지토리로 위임 될 수 있습니다. 이는 각 구성 요소가 하나의 책임만을 얻기 때문에 UI 클래스 팽창의 위험을 줄입니다. 동시에 코드를 테스트하고 지원하기가 훨씬 쉽습니다.

오픈/폐쇄 원리 (OCP) : 확장 설계

오픈/폐쇄 원칙은 클래스가 확장을 위해 열려야하지만 수정을 위해서는 개설되어야한다고 선언합니다. Android 응용 프로그램은 지속적으로 새로운 기능을 업그레이드하고 추가하므로 더 합리적입니다.

Android 응용 프로그램에서 OCP 원칙을 사용하는 방법의 가장 좋은 예는 인터페이스 및 추상 클래스입니다. 예를 들어:

interface PaymentMethod {    fun processPayment(amount: Double)}class CreditCardPayment : PaymentMethod {    override fun processPayment(amount: Double) {        // Implementation for credit card payments    }}class PayPalPayment : PaymentMethod {    override fun processPayment(amount: Double) {        // Implementation for PayPal payments    }}

새로운 결제 방법을 추가해도 기존 클래스를 변경할 필요는 없습니다. 새로운 수업을 만들어야합니다. 이곳은 시스템이 유연 해지고 스케일링 될 수있는 곳입니다.

Android 장치 용으로 생성 된 응용 프로그램에서 개방형/폐쇄 원칙은 토글 및 구성이 동적으로 취한 기능을 수행 할 때 매우 유용합니다. 예를 들어, 앱에 다양한 분석 서비스, FireBase 및 MixPanel 및 사용자 정의 내부 트래커에 이벤트를보고하는 AnalyticsTracker Base 인터페이스가있는 경우 기존 코드의 변경없이 별도의 클래스로 모든 새로운 서비스를 추가 할 수 있습니다. 이렇게하면 분석 모듈을 확장 할 수있게되면 새 트래커를 추가 할 수 있지만 수정을 위해 닫힙니다. 새 서비스를 추가 할 때마다 기존 클래스를 다시 작성하지 않습니다.

Liskov 대체 원리 (LSP) : 상호 교환 성 보장

Liskov 대체 원칙에 따르면 서브 클래스는 기본 클래스를 대체 할 수 있어야하며 응용 프로그램의 동작은 변하지 않아야합니다. Android 에서이 원칙은 재사용 가능하고 예측 가능한 구성 요소를 설계하는 데 기본입니다.

예를 들어, 드로잉 앱 :

abstract class Shape {    abstract fun calculateArea(): Double}class Rectangle(private val width: Double, private val height: Double) : Shape() {    override fun calculateArea() = width * height}class Circle(private val radius: Double) : Shape() {    override fun calculateArea() = Math.PI * radius * radius}

둘 다 구형 그리고 시스템 고장없이 다른 하나의 상호 교환 적으로 교체 할 수 있습니다. 즉, 시스템이 유연하고 LSP를 따릅니다.

안드로이드를 고려하십시오 recyclerview.adapter 서브 클래스. 어댑터의 각 서브 클래스는 연장됩니다 recyclerview.adapter 핵심 함수와 같은 핵심 기능을 무시합니다 oncreateviewholder,,, 정보가없는그리고 titemcount. 그만큼 재활용 해당 메소드가 올바르게 구현되고 앱의 기능을 중단하지 않는 한 하위 클래스를 서로 바꾸게 사용할 수 있습니다. 여기서 LSP가 유지되며 RecyclerView는 어댑터 서브 클래스를 마음대로 대체 할 수 있습니다.

인터페이스 분리 원리 (ISP) : 린 및 집중된 인터페이스

대규모 응용 프로그램에서는 특히 네트워킹 또는 데이터 저장소와 관련하여 책임이 너무 많은 인터페이스를 정의하는 것이 일반적입니다. 대신, 그것들을 더 작고 더 타겟팅 된 인터페이스로 분해하십시오. 예를 들어, 사용자 인증 엔드 포인트를 담당하는 APIAUTH 인터페이스는 블로그 게시물 또는 소셜 피드 엔드 포인트를 담당하는 ApiPosts 인터페이스와는 달라야합니다. 이 분리는 사후 관련 방법 만 필요한 클라이언트가 인증 통화에 의존하고 구현하도록하는 것을 방해 할 수 있으므로 테스트 범위뿐만 아니라 코드를 유지합니다.

인터페이스 분리 원칙은 큰 인터페이스를 갖는 대신 몇 가지 작고 집중된 인터페이스를 사용해야한다는 것을 의미합니다. 이 원칙은 클래스가 불필요한 방법을 구현하는 상황을 방지합니다.

예를 들어, 사용자의 동작을 나타내는 하나의 큰 인터페이스가 아닌 Kotlin 코드를 고려하십시오.

interface Authentication {    fun login()    fun logout()}interface ProfileManagement {    fun updateProfile()    fun deleteAccount()}

이러한 인터페이스를 구현하는 클래스는 필요한 기능에만 초점을 맞출 수 있으므로 코드를 정리하고 유지 관리가 가능합니다.

의존성 반전 원리 (DIP) : 의존성을 추상화합니다

의존성 반전 원리는 높은 수준의 모듈이 구체적인 구현보다는 추상화에 의존함으로써 분리를 촉진합니다. 이 원칙은 Android의 현대적인 개발 관행, 특히 Dagger 및 Hilt와 같은 종속성 주입 프레임 워크와 완벽하게 일치합니다.

예를 들어:

class UserRepository @Inject constructor(private val apiService: ApiService) {    fun fetchUserData() {        // Fetches user data from an abstraction    }}

여기, 사용자 repository 추상화에 따라 다릅니다 사과 서비스유연하고 테스트 가능합니다. 이 접근 방식을 사용하면 테스트 중에 모의 서비스 사용과 같은 구현을 교체 할 수 있습니다.

Hilt, Dagger 및 Koin과 같은 프레임 워크는 Android 구성 요소에 종속성을 공급하는 방법을 제공하여 의존성 주입을 촉진하여 직접 인스턴스화 할 필요가 없습니다. 예를 들어 리포지토리에서 개조 구현을 인스턴스화하는 대신 예를 들어 apiservice 인터페이스에 대한 추상화를 주입하게됩니다. 이렇게하면 로컬 테스트를위한 메모리 인 모의 모의 서비스 인 네트워크 구현을 쉽게 전환 할 수 있으며 저장소 코드의 어떤 것도 변경할 필요가 없습니다. 실제 애플리케이션에서는 클래스가 @inject 또는 @provides로 주석이 달리면 이러한 추상화를 제공하므로 앱 모듈화 및 테스트 친화적입니다.

견고한 원칙의 실질적인 이점

안드로이드 개발에서 탄탄한 원칙을 채택하면 실질적인 이점이 있습니다.

  1. 개선 된 테스트 성 : 집중 클래스와 인터페이스를 사용하면 단위 테스트를보다 쉽게 ​​작성할 수 있습니다.
  2. 향상된 유지 관리 : 우려 사항의 명확한 분리는 디버깅 및 업데이트를 단순화합니다.
  3. 확장 성 : 모듈 식 디자인은 완벽한 기능 추가를 가능하게합니다.
  4. 협동: 잘 구조화 된 코드는 팀워크를 용이하게하고 새로운 개발자의 온 보딩 시간을 줄입니다.
  5. 성능 최적화 : 린, 효율적인 아키텍처는 불필요한 처리 및 메모리 사용을 최소화합니다.

실제 응용 프로그램

전자 상거래 또는 소셜 네트워킹 앱과 같은 기능이 풍부한 응용 프로그램에서 탄탄한 원칙을 적용하면 새로운 기능이나 서비스가 추가 될 때마다 회귀의 위험이 크게 줄어들 수 있습니다. 예를 들어, 새로운 요구 사항에 인앱 구매 흐름이 필요한 경우 기존 모듈에 닿지 않고 필요한 인터페이스 (지불, 분석)를 구현하는 별도의 모듈을 소개 할 수 있습니다. 솔리드에 의해 구동되는 이러한 종류의 모듈 식 접근법을 통해 Android 앱은 시장 요구에 신속하게 적응하고 코드베이스가 시간이 지남에 따라 스파게티로 바뀌지 않도록합니다.

많은 개발자들이 협력 해야하는 대형 프로젝트에서 작업하는 동안, 확실한 원칙을 가진 복잡한 코드베이스를 유지하는 것이 좋습니다. 예를 들어, 채팅 모듈에서 데이터 가져 오기, 비즈니스 로직 및 UI 처리를 분리하면 새로운 기능으로 코드를 확장하면서 회귀 가능성을 줄이는 데 도움이되었습니다. 마찬가지로, DIP의 적용은 추상 네트워크 운영에 중요했기 때문에 네트워크 클라이언트간에 거의 중단되지 않으면 서 변경 될 수 있습니다.

결론

이론적 인 가이드 이상인 견고한 원칙은 실제로 탄력적이고 적응성 및 유지 관리 가능한 소프트웨어를 만드는 실질적인 철학입니다. 빠르게 움직이는 안드로이드 개발 세계에서 기술이 거의 자주 변화하는 요구 사항과 함께 이러한 원칙을 준수하면 성공이 설립 될 수있는 확고한 근거가 있습니다.

좋은 코드는 일을하는 것이 아니라 발전하는 요구로 계속 작동하고 성장할 수있는 시스템을 만드는 것입니다. 탄탄한 원칙을 수용함으로써 더 나은 코드를 작성할뿐만 아니라 개발, 확장 및 유지 관리가 기쁨 인 응용 프로그램을 구축 할 수 있습니다.

게시물 안드로이드 개발에서 탄탄한 원칙을 구현합니다 먼저 나타났습니다 Unite.ai.

Share post:

Subscribe

Popular

More like this
Related

Saeki는 제조 로봇을 확장하기 위해 670 만 달러를 모금합니다

주문형 첨가제 제조 로봇이있는 Saeki 팀. | 출처 :...

연구원들은 북극 아이스 ​​멜트를 자율적으로 추적하기위한 시스템을 구축합니다

개념적 디자인에는 태양열 및 터빈 에너지를 사용하여 지속적인 모니터링을...

Carbon Robotics의 Laserweeder G2는 잡초를 더 빨리 파괴합니다

탄소 로봇 공학 레이저 잡초 제품의 2 세대를 출시했습니다....

소비자 기술 및 디자인에 대한 Steve Jobs의 영향을 축하합니다

하지만 사과 공동 창립자 스티브 잡스 2011...