首页
学习
活动
专区
圈层
工具
发布

当我们使用 MVVM 模式时,我们究竟在每一层里做些什么?

我只是想说说我们究竟应该如何理解 M-V-VM,当我们真正开始写代码时,应该在里面的每一层里写些什么。 ---- MVVM,当然三层——M-V-VM。...就凭这个“三层”结构,WPF/UWP 开发者们就能折腾出一个完整的程序出来。M——定义数据模型啊,V——视图啊,VM——视图模型。...这意味着它只是用来解决我们应用程序中 GUI 部分的开发问题,并不能用来解决其他问题。而一个能持续发展的程序怎么能只有 GUI 呢?...不知看到这里时你会不会喷我一脸——“V”解决 UI 问题也就算了,“VM”和“M”算什么 UI! VM,视图模型。其本质是模型。什么的模型?“视图”的模型。这是为真实的 UI 做的一层抽象模型。...作为数据驱动型 GUI 程序,这些数据是用于驱动 UI 的数据;比如网络请求的数据,本地文件储存的数据。定义这些数据模型是为了与其他组件、其他程序、其他设备传递数据,并将这些数据为视图模型所用。

1.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    PHP中abstract 和 interface的区别

    1.php 接口类:interface 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候php接口类就起到作用了...,当我们定义了一个接口类时,它里面的方式是下面的子类必须实现的,比如 : interface Shop { public function buy($gid); public...,那你就可以考虑使用抽象类了,你可能会说“我不是可以重写一个类每个公共类我个实例化一个这 个公共类,调用相同的方法就可以了”,这里是可以,实际上抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤,...,想上面一样我定义了一个商店类,抽出了它所有像的部分,买(buy),卖(sell),看(view),并且抽象类里都实现了这些方法,那么继承它的子类就自动获得了这些方法,子类就做它自己独特的东西,介绍代码的重复...而 abstract function 方法和interface有些相似,就是父类中生声明的方法,子类中必须实现,但是没有用abstract声明的方法将成为子类的公共方法,没有必要在子 类中必须实现

    1K10

    ECMAScript 2022(ES13)初体验

    level bodies of modules 没有顶级 await 之前,当我们导入一个外部promise.js文件的时候,因为需要等待这个外部 js 执行完成再执行别的操作 // promise.js...这是因为 res 时对象,是一个引用类型,当过了 100 毫秒后,异步操作以及执行完成并且赋值了,而导出的res 和 p.js 里面的res指向同一个地址,所以能监听到改变,但是 num 是基本数据类型...class 公共实例字段 在 ES13 之前,在定义类的属性时,需要在构造函数中定义了实例字段和绑定方法 class myClass { constructor() { this.count...Uncaught SyntaxError: Private field '#setCount' must be declared in an enclosing class 私有静态字段有一个限制:只有定义私有静态字段的类才能访问该字段...该规范就提供了一种在类声明/定义期间评估静态初始化代码块的优雅方法,可以访问类的私有字段。

    1.2K20

    Java系列:构造函数重载和普通函数的那些事~

    关于构造函数,我们下面会说到它的重载,不知道大家有没有想到既然木有返回值,那么我们如果直接把{}括号拿出来使用呢?这就会介绍到匿名构造块,它的作用也是初始化对象。...类中可以有很多个构造函数,但我们知道它们函数中的参数是不一样的;多个构造函数加上构造函数的重载,这样可以衍生出很多个函数,当我们在初始化对象时,就可以表达出对象的多种初始化行为,这也是构造函数重载的一个作用...返回数据类型 void 不返回数据类型 当我们定义函数方法后,在主函数中便会对函数进行调用,在Java类中方法定义了,它是不会自动执行的,如果想要执行,应进行方法调用。...jvm调用的 2.普通函数是由我们创建对象调用的 作用 1.构造函数的作用用于初始化一个对象 2.普通函数是用于描述一类事物的公共行为的 三.方法的重载和编译时多态 上面有构造函数的重载,这里普通函数也是不服了...(把源文件编译成class文件)可知,且运行期(运行class文件)保持不变时,即可将这个方法与所属的类型进行绑定。

    99940

    从 Zero 到 Hero ,一文掌握 Python

    循环和迭代 在 Python 中,我们可以用不同的形式进行迭代。我会说下 while 和 for。 While 循环:当语句是 True 时,while 内部的代码块会执行。...那么,一个类是一个模型,或者是一种定义属性和行为的方法(正如我们在理论部分讨论的那样)。举例来说,一个车辆类有它自己的属性来定义这个对象是个什么样的车辆。...记得车辆类有四个属性:轮子的数量,油箱类型,座位容量和最大时速。当我们新建一个车辆对象时要设置所有的属性。...因此当我们在创建一个车辆对象时,可以定义这些属性。想象一下,我们喜欢 Tesla Model S ,所以我们想创建一个这种类型的对象。...按照这个定义,封装意味着 对象的内部表示一般在对象定义的外部视图中隐藏。” — Wikipedia 对象的所有内部表示都对外部隐藏了。只有对象本身可以与其内部数据交互。

    1.1K90

    零基础到精通Python,从这篇文章开始

    循环和迭代 在 Python 中,我们可以用不同的形式进行迭代。我会说下 while 和 for。 While 循环:当语句是 True 时,while 内部的代码块会执行。...那么,一个类是一个模型,或者是一种定义 属性 和 行为 的方法(正如我们在理论部分讨论的那样)。举例来说,一个车辆 类 有它自己的 属性 来定义这个 对象 是个什么样的车辆。...记得车辆 类 有四个 属性 :轮子的数量,油箱类型,座位容量和最大时速。当我们新建一个车辆 对象 时要设置所有的 属性 。...因此当我们在创建一个车辆 对象 时,可以定义这些 属性 。想象一下,我们喜欢 Tesla Model S ,所以我们想创建一个这种类型的 对象。...非公共变量仅仅是一个惯用法,并且应该被当做API的非公共部分。 所以我们使用一个在类定义内部的方法来实现该功能。

    1.7K60

    Python 密集知识点汇总

    循环和迭代 在 Python 中,我们可以用不同的形式进行迭代。我会说下 while 和 for。 While 循环:当语句是 True 时,while 内部的代码块会执行。...那么,一个类是一个模型,或者是一种定义属性和行为的方法(正如我们在理论部分讨论的那样)。举例来说,一个车辆类有它自己的属性来定义这个对象是个什么样的车辆。...记得车辆类有四个属性:轮子的数量,油箱类型,座位容量和最大时速。当我们新建一个车辆对象时要设置所有的属性。...因此当我们在创建一个车辆对象时,可以定义这些属性。想象一下,我们喜欢 Tesla Model S ,所以我们想创建一个这种类型的对象。...非公共变量仅仅是一个惯用法,并且应该被当做API的非公共部分。 所以我们使用一个在类定义内部的方法来实现该功能。

    82830

    线程安全知多少

    首先,我们来理清一下类型和类型成员: 类型是指类本身,类型成员是指类所包含的方法、属性、字段、索引、委托、事件等。类型成员又分为静态成员和实例成员。...是因为它一定通过某种机制,去确保了公共静态成员的线程安全。(这一定是微软源码的一个规范)。 那显而易见,对实例成员,可能由于没有了这样的一个限制,才会说,不确保实例成员是线程安全的。...这个类中,公共静态成员主要是几个静态方法,我简单列举一个: public static IList ReadOnly(IList list) { if (list...这里为什么可以自信的保证所有public和protected 成员是线程安全的呢?...而关于线程同步的方式,可参考C#编程总结(三)线程同步。 另外在书写代码时,为了避免潜在的线程安全问题,对于不需要改动的公共静态变量,使用readonly修饰不失为一个很好的方法。 4.

    71450

    如何编写线程安全的代码?

    可这是为什么呢?为什么多线程代码如此难以正确编写呢? 从根源上思考 关于这个问题,本质上是有一个词语你没有透彻理解,这个词就是所谓的线程安全,thread safe。...我的衣服、我的电脑,我的手机、我的车子、我的别墅以及私人泳池(可以没有,但不妨碍想象),我想怎么处理就怎么处理,妨碍不到别人,只属于我一个人的东西以及事情当然不关别人,即使是屁事也不关别人。 ?...因为这些都是我私有的,只有我自己使用。 那么什么时候会和其它人有交集呢? 答案就是公共场所。 在公共场所下你不能像在自己家里一样想去哪就去哪,想什么时候去厕所就去厕所,为什么呢?...如果你想去饭馆、去公共卫生间那么就必须遵守规则,这个规则就是排队,只有前一个人用完公共资源后下一个人才可以使用,而且不能同时使用,想使用就必须排队等待。 上面这段话道理足够简单吧。...有的同学可能会说如果我传入的不是全局变量的指针(引用)是不是就不会有问题了? 答案依然是it depends,要看情况。

    93340

    git subtree: 冷门又好用的git指令

    转发请携带作者信息@怒放吧德德 @一个有梦有戏的人前言本次来介绍一个git命令中很少用过的一个指令,相信70%的开发者都没有接触过这个指令。笔者能学到这个指令还得从领导说起。...事情的起因是这样的,领导想要把我们公共通用的代码做个统一管理,方便其他子项目用的时候,只用改一次,其他项目只要拉取就好了。当时领导也是想破头脑,我也做了很多的尝试,都没能很好的做到。...项目仓库当我们创建一个新的项目时候,并且先把他拉取下来,这样就得到一个我们要开发的新项目sub-test-project当我们这个新项目有两个子系统,但是这两个子系统还要放在一个仓库中,也就是这两个子系统有一些不可变的代码...当然,有的人会说,这个为啥这么折腾呢?直接这个项目改完,以后还有其他项目要用,其他项目在跟着改。这话说的没毛病,但是,如果是一个项目型公司,有好几十个项目,总不可能一个一个改吧。...接下来我们做个实验,我们在ParentCode项目中的A分支的A.java文件添加一行代码,然后在sub-test-project项目中拉取,看看sysA的代码会不会跟着修改,并且我在sysA中新增一个类

    1.4K21

    零基础学Java(12)静态字段与静态方法

    大家好,又见面了,我是你们的朋友全栈君。 静态字段与静态方法   之前我们都定义的main方法都被标记了static修饰符,那到底是什么意思?...下面我们来看看 静态字段   如果将一个字段定义为static,每个类只有一个这样的字段。而对于非静态的实例字段,每个对象都有自己的一个副本。例如,假设需要给每一个员工赋予唯一的标识码。...换句话说,如果有1000个Employee类对象,则有1000个实例字段id,分别对应每一个对象。但是,只有一个静态字段nextId。即使没有Employee对象,静态字段nextId也存在。...例如,Math类的pow方法就是一个静态方法。表达式Math.pow(x, a)会计算幂x的a次方。在完成运算时,它并不使用任何Math对象。换句话说,它没有隐式参数。   ...构造器的名字必须与类名相同。但是,这里希望有两个不同的名字,分别得到货币实例和百分比实例。 使用构造器时,无法改变所构造对象的类型。

    40220

    C ++ 中不容忽视的 25 个 API 错误设计!

    三法则是,如果一个类定义了析构函数、复制构造函数或复制赋值运算符,那么它应该明确定义三个函数所有,而不是依赖它们的默认实现。 为什么忽略三法则是一个错误?...因此,如果你的类只包含简单的数据类型,并且你计划使用隐式生成的移动构造函数,那么如果你定义复制构造函数则不可能。在这种情况下时,你必须显式定义移动构造函数。...它的好处是保持主要公共头文件不受实现细节的影响,同时将内部细节的必要暴露,隔离到明确指定为包含私有细节的单独头文件。 错误#10:当用例已知时,不使用显式模板实例化 为什么这是一个错误?...: static void ExecuteRequest(CallRequestContainer& reqContainer); 当我看到这个时,我完全不知道这个方法是立即返回(异步)还是阻塞(同步)...有些情况下,只有头文件是唯一的选项,例如在处理模板时(除非你选择通过显式实例化为特定类型专门化模板) 这是许多开源项目使用的非常流行的模型,包括Boost和RapidJson。

    2K20

    整理了一些基础的Python知识点,分享给大家

    同样,一个类,它只是一个模型,或者一种定义属性和行为的方法(正如我们在理论部分所讨论的)。例如,车辆类有自己的属性,定义什么是车辆。车轮的数量、能源的类型、座位容量和最大速度都是车辆的属性。...这些方法的工作机制与属性不同。例如,当我们设置轮子数量时,我们需要把2赋值给一个变量,只需要设置 “number_of_wheels” 的值为2。...--- PEP 8 和公共变量实例一样,我们可以在构造函数或类内部定义非公共变量实例。语法上的差异是: 对于非公共变量实例,我们在变量名前加一道下划线(_)。...非公共方法 但是通过 非公共方法 我们却无法做到这一点。 我们先来实现一个同样的 Person 类,不过这回我们加个下划线(_)来定义一个 show_age 的非公共方法。...在Python中我们可以将父类作为子类定义时的参数。一个ElectricCar类能从之前的Car类中继承。

    98920

    二、第一个java程序:HelloWorld

    Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。我们保存的文件“HelloWorld.java”就是一个类文件,java程序的源文件必须与类名保持一致。...而public就是类的访问修饰符,表名类是HelloWorld一个公共访问类。...一个Java程序由一个或多个类组成,每个类可以有多个变量和方法,但是最多只有一个公共类public。...记住:一个java程序(项目),最多只有一个公共类public 3、注释用双斜杠表示,如果多行注释采用“/*注释内容 */”的方式。...6、使用javac编译源程序是,会自动生成一个字节码文件,本例中生成一个“HelloWorld.class”字节码文件。字节码文件一般默认生成路径和类文件(源程序)文件在同一目录。

    52830

    《苍穹外卖Day3:大一菜鸟的代码升空纪实》

    (使用的是阿里云OSS) 2.任务中的收获 2.1公共字段填充功能 1.为什么要实现这个功能?...,而注解AutoFill里面要求我们用注解时必须给它一个Opertion的值 (具体知识点在下面扩展处) 2.自定义切面类: 要求:加入@Aspect(切面类必须的注解) 与@Component...,为什么前面还定义一个扫描范围呢?...=》(这样是不是效率高了,本来是每个包都要扫描的,现在只有扫描我定义的这个包就行了) 2.第二步:定义通知(类型为@Before,为什么?...)--> 服务端接收路径存入数据库 --> 再返回这个路径给前端 --> 前端访问这个路径直接下载这个文件将其展示在页面上 3.建议自己会去定义关于操作阿里云OSS的工具类 4.注意:接收前端传过来的文件参数时

    13100

    04-01-设计模式 单利模式

    } 我感觉这没啥好测试的, 我下面就直接写代码了, 但凡做过开发的,应该都看的懂 总结 优点 写法简单, 线程安全 缺点 不是懒加载, 如果不用的话, 就会造成内存浪费 为什么线程安全?...应为并没有在类加载的时候就创建, 而是在第一次调用的时候才创建的 为什么说线程不安全 应为没有锁机制, 导致多个线程可能同时进入到if块的内部, 导致都创建了对象,导致多利的存在, 破坏了单利模式的存在...if块外面, 就会和同步方法一样,直接卡到开头, 所我感觉我起的这个名字很好"单利Five", 怪不得排在第五 不要用,不为啥 双重检查 步骤 参考同步方法的步骤 将同步块放在if块的外面,然后在同步块的外面再包一层...应为类只有在第一次调用或者其他类依赖的时候才会进行类加载, 类加载, 这个内部类没有没其他类依赖, 并且是内部的所以在加载外部类的时候,也不会加载内部类, 只有第一次调用 getInstance方法时才会触发类加载...创建对象耗时过多或耗费资源过多(即: 重量级对象), 但又经常用的对象 工具类 频繁访问数据库或文件的对象 数据源 Session工厂

    44230

    android 资源文字ids的作用

    若在ids.xml中定义了ID,则在layout中可如下定义@id/price_edit,否则@+id/price_edit。 为什么使用ids? 我个人认为有以下几点作用: (1)优化编译效率。...如果xyz在R.java中已经存在同名的变量,就不再生成新的变量,而该组件会使用这个已存在的变量的值。 使用@id/name形式,预先定义的id已经生成,修改配置文件时,也不会引起系统重新生成。...添加id的方法: 1)在ids.xml中添加公共id项,在public.xml中也添加相应的id项。这种办法没有兼容性,会与后面的版本产生冲突。...其它常用的资源文件: attrs.xml——当中定义的是类的属性,属性是为了能在xml文件中被引用到,换句话说就是指定类中变量(也就是属性的实际作用者)的值。这些属性会在类的构造函数中用到。...类的构造函数一般有三个,一个是Class(context),这个用于在代码中创建一个类,所以只包含一个上下文;Class(context, attrs)和Class(context, attrs, defStyle

    1.9K50

    「奇淫技巧」如何写最少的代码

    这样做有没有问题?当然没有问题,但是瑕疵就在于:可能会产生没啥语义但又不得不存在的中间类,我个人非常讨论该类代码,那么该如何解决这种问题呢?...由于在方法定义时就强制了泛型约束,语义非常清晰,同时可以完全杜绝上述的无语义中间类,当然一些必要的,有业务含义的组装类,不建议使用这种方式。...Bean,那个时候我只有一个想法:new 一个 T 事实证明,我过于天真了 ?...真相只有一个:模板方法模式 我刚提到了我需要一个处理爬虫的通用接口,因为简单爬虫无非就是拿到url然后请求,解析细节封装到自身的Bean里,然后获取一个列表,那么在开发业务代码的时候类似,肯定有某些场景和需求具有高度的一致性...同时,当我们需要调整某一个方法逻辑时,也可以使用继续重载的方式,将影响面降到最小,尽量不动其他模块的代码。 终极:从设计模式到抽象 与其说是如何写最少的代码,不如说是:如何只写真正有价值的代码。

    44130

    Linux之权限

    同时可以看到,当我使用“sudo”后,系统要我输入我的密码这是为什么呢? 是为了给相信的用户提供一个最少执行障碍的环境。...文件类型和访问权限 当我们使用“ ll ”查看文件信息时,可以看到前面有一大串信息,那么这些信息代表的是什么意思呢?...也就是说,所有人都拥有对普通文件的读写权限,所有人都对目录文件拥有读写和可执行权限,但是当我们创建一个全新的文件时发现,操作系统上面显示的好像并不是这样的: 这是为什么呢?...我首先用root用户在根目录下创建一个属于我的临时目录,在切换到wwj和wbm两个普通用户,用这两个普通用户分别在这个临时目录中创建两个文件: 现在我是wbm,我在公共目录下看到wwj的文件,我很好奇这小子在这里面写了什么...这里我想玩一个三体的梗:我毁灭你与你何干。要知道虽然wwj1没有向other放开任何权限,但是这个公共目录在创建时对other是放开了权限的,因此wbm对wwj1文件的删除操作成功了。

    70600
    领券