В каких проектах не стоит использовать Clean Architecture

Ответ

Clean Architecture может быть избыточной для небольших проектов с простой логикой, например, для прототипов или MVP с минимальным функционалом. Также не стоит её применять, если команда не имеет опыта работы с ней — это увеличит сроки разработки и сложность поддержки.

Пример: простое приложение для отображения списка статей из API.

// Без Clean Architecture
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val recyclerView = findViewById<RecyclerView>(R.id.recycler)
        val adapter = ArticleAdapter()
        recyclerView.adapter = adapter

        RetrofitClient.api.getArticles().enqueue(object : Callback<List<Article>> {
            override fun onResponse(call: Call<List<Article>>, response: Response<List<Article>>) {
                adapter.submitList(response.body())
            }
            override fun onFailure(call: Call<List<Article>>, t: Throwable) {
                Toast.makeText(this@MainActivity, "Error", Toast.LENGTH_SHORT).show()
            }
        })
    }
}

Здесь Clean Architecture только усложнит код без реальной пользы.

Ответ 18+ 🔞

Давай сразу начистоту, без этих ваших архитектурных понтов. Чистая архитектура — это, конечно, круто, когда у тебя проект размером с Гугл, но если ты пишешь очередную хуйню для отображения списка котиков из API, то это просто ёперный театр.

Представь, ты делаешь прототип, MVP или просто маленькое приложение, где логики — как у мартышлюшки. Ты там три экрана, один запрос к серверу и всё. Зачем тебе там эти слои, интерфейсы, инверсии зависимостей? Это как приехать на дачу на танке — овердохуища шума, а толку ноль. Ты просто картошку посадить хотел, а в итоге весь огород перекопал гусеницами.

И главное — команда. Если твои ребята впервые слышат про Clean Architecture, а ты им такой: «А теперь, сука, сделаем UseCase для загрузки котиков!». Они просто охуеют. Сроки разработки взлетят до небес, а код станет таким запутанным, что разбираться в нём будет только тот, кто его писал, да и то через месяц сам нихуя не поймёт.

Вот смотри на этот пример. Простое приложение, которое показывает список статей. Без всякой архитектуры.

// Без Clean Architecture
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val recyclerView = findViewById<RecyclerView>(R.id.recycler)
        val adapter = ArticleAdapter()
        recyclerView.adapter = adapter

        RetrofitClient.api.getArticles().enqueue(object : Callback<List<Article>> {
            override fun onResponse(call: Call<List<Article>>, response: Response<List<Article>>) {
                adapter.submitList(response.body())
            }
            override fun onFailure(call: Call<List<Article>>, t: Throwable) {
                Toast.makeText(this@MainActivity, "Error", Toast.LENGTH_SHORT).show()
            }
        })
    }
}

Всё! Работает, понятно, быстро сделано. А теперь представь, что мы сюда притащим Clean Architecture. Нам понадобится: Entity, Model, Mapper, Repository interface, Repository implementation, UseCase, ViewModel, и это ещё если не считать всякие DataSource. И всё это ради того, чтобы в итоге вызвать тот же самый getArticles()? Да ну нахуй, серьёзно. Это же чистой воды пиздопроебибна получается.

Конечно, если ты чувствуешь, что проект реально будет расти, что там будет сложная бизнес-логика, куча источников данных — тогда да, надо думать об архитектуре с самого начала. А если это «попробовать идею» или «заказчику показать макет», то не надо тут выёбываться. Сделал, показал, получил фидбэк. Если идея выстрелит — тогда уже, ебать копать, можно и переписать всё по-взрослому. А пока — не усложняй себе жизнь. Иногда простота — это не признак распиздяйства, а здравый смысл.