Clean Architecture - 规划和初始设置

瞎谈干净架构(clean architecture) 关于干净架构(Clean Architecture)的一次尝试和总结 阅读详情

目标

这是更广泛的 CLean Architecture 文章系列的一部分。我们要实现的目标

  • 我们将为我们的应用程序研究几种模块化解决方案。
  • 为我们的 Github 配置文件项目设置模块

本节之后的项目结构如下。

在本文时,您将大致了解如何考虑模块化应用程序和设置模块化 android 项目。

项目概况

我们将构建一个 Android 应用程序,以按照简洁的架构指南获取 GitHub 配置文件。该应用程序将从GitHub API获取数据,将其保存在本地数据库中,并将其显示在 UI 上。

本节将进行规划,这是任何项目的第一步,也是最关键的一步。在某些情况下,已经为您完成了规划,您必须立即着手,设置环境并开始构建软件。但是,在某些情况下,您将需要进行规划。例如,当您成为高级开发人员时,您将花费大量时间规划应用程序、选择工具并确保软件实施按计划进行。

模块化

我们将应用程序分成几个模块。模块化对您的组织有几个好处。一些优点是:

  • 委派 ——如果您正在构建一个超出少数开发人员的应用程序,您需要将不同的部分委派给不同的开发人员或团队。将应用程序划分为模块集中了每个模块的范围,使其易于委派。少数开发人员可以拥有应用程序的一部分,并且开发和测试不互相踩脚。团队可以在不影响其他开发人员工作的情况下试验他们的模块。

  • 代码可重用性——我们希望尽可能多地重用代码片段,并尽可能避免重复,使用 DRY 原则。当您模块化您的应用程序时,您可以使代码易于重用。

  • 构建速度——模块化的关键优势之一是提高构建速度。在大型应用程序中,构建速度可能是一个挑战。现代应用程序通常是具有不同子应用程序的大型超级应用程序。构建如此广泛的应用程序将花费大量时间。调试也将是一个大问题。当你模块化你的应用程序时,你有几个选项可以提高你的构建速度。例如,您可以并行运行应用程序,或者运行单个模块,在其中应用更改,从而大大减少构建时间并提高生产力。

模块化过程

模块化应用程序类似于为您的房子选择架构。很有主见。关于如何模块化应用程序存在争议。它高度依赖于您的应用程序、团队、特定需求和您的偏见。没有经验法则。

但是,与任何其他工程实践一样,存在优秀、中等和明显较差的模块化决策。一些模块化实践更容易实现和维护,而另一些则让你陷入困境。选择不会伤害您的开发人员的方法。

三种常见的模式是

  • 按层模块化 - 将您的代码划分为各自的架构层:域、数据和表示。应用程序中的三层具有不同的功能。数据层集中在与数据相关的逻辑上,即从远程数据源获取数据,使用房间和数据存储库处理本地缓存,以及存储库实现。领域层只负责管理您的业务逻辑,其中您拥有业务逻辑模型、存储库接口和用例。您的演示文稿将包含您的屏幕及其演示文稿。这在小型团队中很有用。如果您以前从未模块化过您的应用程序,那么这是开始模块化的好地方,因为您可以可视化每个模块的功能。然而,
  • 按功能模块化 - 将代码划分为它的功能,主要是它所代表的屏幕。在这里,每个模块都包含特定区域和碎石的逻辑。例如,您的登录逻辑将是一个仅处理与逻辑相关的逻辑的模块。此选项使您可以轻松地尝试不同的选项。如果你想在一个小市场尝试一个新功能,你可以让一些工程师实现并发布该功能,而不会打扰主应用程序。您可以交付具有功能模块化的动态应用程序。如果您的应用程序中有 30 个功能,那么一个团队可以独立处理每个功能,而不会互相拖后腿。这种模块化的挑战是随着应用程序变得越来越大,代码重复的可能性很高。一个团队将编写另一个团队编写和测试的代码的 30%。
  • 混合模块化 - 这是层和功能模块化的组合,还有一个额外的模块注入器类,其中包含基本抽象并将所有模块粘合在一起。混合模块化没有规则。然而,如果一个模块是可重复使用的,比如检查网络连接,或者独立的,作为一个可穿戴的应用程序,那么它是单个模块的一个很好的候选者。这是混合模块化中的模块如何交互的示例。


模块化对于一个团队来说可能是灵丹妙药,而对于另一个团队来说则是兔子洞。始终考虑您的情况。

我们有什么

这是一个最小的应用程序。我们将其分为三个模块。

  • 数据模块 - 该模块将保存与数据相关的逻辑。它是一个包含本地和远程数据的Android 库。在健壮的应用程序中,我们会做一些分离。例如,我们将拥有仅负责远程数据的远程数据和处理缓存的本地数据。在这种情况下,远程数据模块将是 Kotlin 和 Java 库,而本地数据将是 Android 库。
  • 域模块 - 保存业务逻辑信息的纯 Kotlin 和 Java 库。它有我们的业务逻辑模型、单一事实来源和用例。
  • 演示模块 - 所有与 UI 相关的逻辑。我们将为应用程序中的所有屏幕提供 UI、UI-State 和 ViewModels 逻辑。使用大型应用程序时,我们会将层分离到不同的模块中,以保存精确且独立的 UI 逻辑。但是,由于我们的应用程序很小,我们将原谅自己并将其设为单个模块。

设置

现在,让我们为我们的项目设置主干。

创建一个新 项目 在 Android Studio 中启动一个新项目(您也可以使用您的一个辅助项目)当 Android Studio 构建您的项目时,将应用程序模块重构为演示文稿,因为这将在此项目中执行。您也可以将模块保留为应用程序。

App => Refactor =>Rename => Rename Module


重命名为演示文稿


将名称从app更改为展示项目结构。


添加数据和域模块 域模块将是一个纯 Kotlin 库,没有任何对 Android 库的引用。数据模块将是一个 Android 库,因为我们有房间和数据存储库的缓存逻辑,它们是 android 框架。

要添加数据模块,

Project View => New ⇒ Module ⇒ Android Library

命名模块数据


接下来,我们添加域模块。

Project View => New ⇒ Module ⇒ Java or Kotlin Library

命名模块域

等待项目同步。此时,我们有一个多模块应用程序。

注意:presentation 文件夹中的点表示该模块可以与 android 应用程序捆绑在一起,因为我们有 android 应用程序插件

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

Android 库有三个栏,Kotlin 库有一个蓝色的小方块。

这就是我们的依赖项的样子

settings.gradle 文件


域级依赖

表示层依赖

数据级依赖

项目级依赖

这样来看。我们不再有一个单体应用程序,而是一个模块化的应用程序。

接下来,我们将配置 Kotlin DSL。尽管对于大型项目是可取的,但使用 Groovy 管理依赖关系非常好。

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。


Android架构视频+BAT面试专题PDF+学习笔记如有需要可以点击文末的微信卡片即可免费领取

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

整洁架构读书笔记(Clean Architecture) 又称干净的架构The Clean Architecture,这是著名软件工程大师Robert C Martin提出的一种架构整洁清晰之道,也是当前各种语言开发的目标架构。干净、清晰、整洁的架构应该只包含单向的依赖关系,这样才可以在逻辑上形成一种向上的抽象系统。 我们经常听说过如下各种架构: 六边形架构Hexagonal Architecture (也称为 端口和适配器) 这是由Alistair C... 阅读详情

相关推荐

Android Clean Architecture最佳实践详解

至关重要!使用Hilt(官方推荐) 或 Koin/Dagger 管理所有层的依赖关系 (ViewModel, UseCase, Repository, DataSource, Retrofit, Room)。这解决了依赖创建和传递的问题,使代码更可测试、更灵活。处理异步操作的现代标准。

JMY_2016的博客 1718

架构设计模式:Clean Architecture实践

Clean Architecture是一种由Robert C. Martin提出的软件架构模式,通过分层设计实现代码的可测试性、可维护性和可扩展性。在Flutter应用中,它通常分为表示层(UI)、领域层(业务逻辑)和数据层(数据访问)三层,依赖关系从外层指向内层单向流动。领域层包含业务实体、用例和仓库接口,是架构的核心且独立于其他层。这种架构通过依赖倒置原则和关注点分离,使Flutter应用更易于维护、测试和适应变化,同时提高团队协作效率。典型实现包括清晰的项目结构组织、纯Dart业务实体定义、抽象仓库接

Ya-Jun 的博客 1440

Feature-Sliced Design 与 3 种主流前端架构深度对比:DDD、Clean Architecture、原子设计

本文深入对比了Feature-Sliced Design (FSD) 与领域驱动设计 (DDD)、整洁架构 (Clean Architecture) 和原子设计 (Atomic Design) 这三种主流前端架构的异同。通过分析核心设计理念、依赖管理、代码组织方式和技术实现细节,帮助开发者在不同业务场景下选择最适合的架构方案,提升项目的可维护性和开发效率。

weixin_33696106的博客 296

深入理解 Android 架构 Clean Architecture(介绍篇)

在 Android 开发领域,选择适合的架构常常成为新手开发者们的一大挑战。从以往的MVC、MVP、MVVM再到MVI,每种设计模式都在其特定的背景下提供了一种组织和管理代码的方式,这让新手开发者感到困惑,不知道该如何抉择。本文将采用分篇的形式深入探讨 Android 架构模式,分析它们的特点和应用场景,帮助新手开发者选择适合自己项目需求的架构。

Android/Kotlin/Ktor/Compose 2673

Clean.Architecture.pdf

Clean.Architecture.pdf Clean.Architecture.pdf Clean.Architecture.pdf

Clean Architecture:软件架构与设计匠艺(英文版)

Clean Architecture:软件架构与设计匠艺 一本非常好的讲解架构设计的书籍

Clean Architecture 实施指南

在之前的那篇《整洁前端架构》的文章里, 我们介绍了如何在前端领域里使用 Clean Architecture。在过去的几个月里,我们实践了 Clean Architecture 架构,并且实践证明了 Clean Architecture 也可以在前端工作得非常好。 Clean Architecture + MVP + 组件化架构 开始之前,让我们先看一下使用 Clean Architecture ...

Phodal's zenthink 1671

Python实战:用MOOTDX库轻松抓取股票分时数据并绘制专业图表(附完整代码)

本文详细介绍了如何使用Python的MOOTDX库获取股票分时数据,并通过Pandas进行数据清洗与VWAP计算,最后利用Matplotlib绘制包含价格线、均线和成交量的专业分时图。文章提供了从环境搭建、数据获取到可视化呈现的完整代码,帮助读者快速构建本地化的股票分时数据分析工具。

weixin_29041195的博客 475

从零开始参与Go Backend Clean Architecture开源项目:完整贡献指南

Go Backend Clean Architecture是一个基于Golang的后端项目,采用清晰的分层架构设计,集成了Gin框架、MongoDB数据库、JWT认证中间件,并提供完整的测试和Docker支持。本指南将帮助新手开发者快速掌握参与该开源项目的完整流程,从环境搭建到代码提交的每一步都有详细说明。 ## 为什么选择参与Go Backend Clean Architecture项目?

gitblog_00879的博客 737

Oracle PLM Agile936 单点登录配置方式

Oracle PLM Agile936 单点登录配置方式

Jay的个人博客 825

未隔离电源设备使用usb转串口调试导致串口模块爆炸烧坏事故记录

这个事就发生在前两天,我们公司的wifi模块被客户用到了咖啡机上,客户寄了一台整机给我们协助调试,还送了几包咖啡豆,本想着还能打个咖啡喝一喝的,但就在咖啡机刚寄过来第一天,就出事了。而这个事故的发生,竟然仅仅是因为同事接了个串口模块到电脑调试打印导致的。谁也想不到,这个3.3V的供电的wifi模块居然还有这么大的威力。直接将usb转TTL串口模块的转换芯片给爆开了,咖啡机也给弄坏了,据同事描述当时情况就只见到一片火光和一声巨响,状况比较惨烈,所幸的是笔记本电脑没有烧坏,但是直接给崩蓝屏了。 ...

fangye945a的博客 6195

React with Clean Architecture vs 传统MVC:为什么框架独立架构是前端未来?

在快速发展的前端开发领域,架构选择直接影响项目的可维护性、可测试性和长期发展潜力。React with Clean Architecture 项目展示了如何将**Clean Architecture(整洁架构)** 与 React 框架结合,创建**框架独立**的前端应用架构。这种创新的架构模式正在改变我们对前端应用设计的理解,为复杂应用提供了全新的解决方案。 ## 🎯 传统MVC架构的局限性

gitblog_01054的博客 961

Windows server Database 2025 安装 i225/i226 网卡驱动

Windows server Database 2025 安装 i225/i226 网卡驱动 windows这比坏得很,intel消费级网卡不准在服务器系统上安装。你要说他是异构不支持?他就纯粹恶心人。 之前已经安装过一次,但是今天database预览版一更新,又给我把网卡驱动杀了,气死,写一篇教程。 到这里就完成了,总之还是想辱骂windows,提供便捷的同时又人为制造困难,多少有点(隔壁linux内核直接自带全家桶了就一省心) 并且近年Intel的新U安装显卡驱动和普通声卡驱动都不会出声

低温热源的博客 1万+

AndroidArchitectureBook快速上手:5步搭建你的第一个Clean Architecture分层项目

AndroidArchitectureBook 是一本面向 Android 开发者的 **Clean Architecture 分层架构**实战指南,它把"理论—实践—案例"串成一条完整的学习路径。很多新手看完罗伯特·马丁(Bob Martin)的 Clean Architecture 理论后,依然不知道从何下手:包该怎么分、依赖该往哪指、Repository 到底放哪一层。本文将带你用 **5

gitblog_00713的博客 407

【学习系列】SAP RAP 2:创建第一个RAP应用

本文介绍了从零开始创建基于SAP RAP(ABAP RESTful Application Programming Model)的Fiori应用的完整流程。首先说明了学习RAP需要结合官方文档和教程,并提供了相关资源链接。文章详细讲解了开发环境的准备要求,包括系统版本、开发工具和基本知识。重点演示了如何通过8个步骤创建支持CRUD操作和草稿功能的RAP应用:1)创建数据库表;2)定义CDS视图实体;3)创建投影视图;4)定义行为;5)创建行为投影;6)定义服务;7)绑定服务;8)添加UI注解。

DeveloperMrMeng的博客 1502

3.7 改造模型:为GPT添加一个分类头(Classification Head)

本文介绍如何改造GPT模型用于文本分类任务。主要内容包括: 分类头设计思路:GPT作为语言模型需要添加分类头才能适应分类任务,类似于为语言大师添加裁判功能。 序列表示选择策略: 分析三种常见方法(CLS标记、平均池化、最后词元表示) 推荐使用最后词元表示,因其最能反映GPT的单向信息流特性 代码实现: 构建GPT2ForSequenceClassification类 包含预训练GPT主体和线性分类头 使用attention_mask智能定位句子结尾 通过高级索引提取最后词元特征 该方法通过简单改造使GPT模

yonggeit的博客 2972

TimePlanner架构解析:Clean Architecture + MVI的完整落地指南

TimePlanner 是一款完全免费的 Android 每日任务计划应用,支持时间轴排程、模板自动重复、任务统计分析与定时通知。本文带你完整拆解它是如何用 **Clean Architecture + MVI** 落地一套可维护的多模块架构,是学习 Kotlin 工程化架构的优质开源范本。 [![TimePlanner免费时间计划应用架构总览:包含Home时间轴、Templates模板与Ana

gitblog_00020的博客 448

【目标跟踪】基于Kalman滤波实现无人机运动轨迹跟踪附matlab代码

1 简介 在近代控制中,需要对某一特定的运动目标进行跟踪监测,并需要对其下一时间的运动位置,运动方向,速度等信息进行预先估算,才能达到对目标的即时控制.本文简要讨论了用卡尔曼滤波算法对单个目标航迹进行预测,并借助于Matlab仿真工具,对实验的效果进行评估. 2 部分代码 clc; close all; %initial state xo=25; vox=2; %Observations **** % X-Direction Calcula

qq_59747472的博客 4731

SwiftUIX架构模式终极指南:MVVM与Clean Architecture实战解析

SwiftUIX作为标准SwiftUI库的全面扩展,为开发者提供了丰富的组件和工具来构建高质量的iOS和macOS应用。本文将深入探讨如何在SwiftUIX项目中实现MVVM和Clean Architecture架构模式,帮助开发者构建可维护、可测试的现代化应用。😊 ## 什么是SwiftUIX架构模式? SwiftUIX架构模式是一套在SwiftUIX框架中组织代码、分离关注点的最佳实践。

gitblog_00761的博客 850

生成mm grounding dino的onnx模型并在x-anylabeling中使用

X-AnyLabeling 是一款cvhub开发的交互式自动标注工具,其基于AnyLabeling进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助Segment Anything和YOLO等主流模型提供强大的 AI 支持。其最新版基于grounding dino可以实现开放词汇检测及生成掩码。2024年,MMDet 3.3.0提出了 MM-Grounding-DINO。

blanokvaffy的博客 1733

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

3步掌握Clean Architecture:架构整洁之道中文版完全指南

《架构整洁之道》中文版是每位开发者都应该拥有的架构设计宝典,通过开源项目Clean-Architecture-zh,你可以免费获得这份珍贵的知识资源。这个项目不仅提供了完整的中文翻译,还构建了优雅的在线阅读体验,让你从零开始理解软件架构的核心原理。 ## 🎯 为什么选择Clean-Architecture-zh项目学习架构设计 对于新手开发者而言,最大的痛点往往是面对复杂的架构概念时无从下手

gitblog_00788的博客 1095

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Flutter艺术探索-Clean Architecture:整洁架构在Flutter中的应用

领域层是架构的心脏,我们先从这里开始。采用Clean Architecture构建Flutter应用,初期的确需要更多思考和设计。但从长远来看,这种投资是值得的——它为你的应用带来了清晰的结构、可独立测试的核心逻辑,以及应对未来变化的强大韧性。本文展示的只是一个起点。在实际项目中,你可能会遇到更复杂的场景,比如身份验证流、实时数据同步、复杂的领域事件等。但万变不离其宗,只要坚守“依赖向内、关注点分离”的原则,你就能在整洁架构的基础上,构建出稳定、可扩展的Flutter应用。希望这篇指南能为你铺平道路。

nanxuan521的专栏 604

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

.NET 10 Web API接入AI:Clean Architecture与EF Core实践

在现代后端开发中,架构分层与数据访问是构建可维护系统的基石。Clean Architecture 通过明确领域、应用、基础设施与表示层的边界,让业务逻辑与外部依赖解耦,从而提升代码的可测试性与可扩展性。EF Core 作为 .NET 生态中的主流 ORM,简化了数据库迁移、查询与事务处理。随着大模型能力快速普及,将 AI Agent 集成到 Web API 中已成为企业级应用的新趋势。本文基于 .NET 10 Web API 项目,展示如何以 Clean Architecture 为骨架、EF Core 为

weixin_34318272的博客 345

Agentic Awesome Skills 架构模式实战:Clean Architecture、Hexagonal 与 DDD 实施手册

本手册以 agentic-awesome-skills(AAS)仓库中 `architecture-patterns` 技能配套的 [implementation-playbook.md](https://pre-link.gitcode.com/i/b90c58d5a0bcbb5aa6811bd556eb7dd7) 为核心骨架,系统讲解 Clean Architecture、Hexagonal

gitblog_00201的博客 277

【亲测免费】 BlazorHero:基于Clean Architecture的Blazor WebAssembly模板

BlazorHero 是一个采用清洁架构设计的 Blazor WebAssembly 开源项目模板,它利用了现代的 .NET 技术栈,特别是 ASP.NET Core 和 Entity Framework Core 6.0,搭配高效且美观的 MudBlazor 组件库。此项目以 C# 作为主要编程语言,支持 Blazor 的客户端渲染模式,并通过 Docker 提供容器化部署选项,展现了高度的企业...

gitblog_00840的博客 1025
上一篇: 使用 MERN 堆栈构建登录/注册 - 第 1 部分(后端)
下一篇: 如何通过调用实现 Android 应用的前台服务和深度链接?带有代码示例
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值