关于代码编写时「抽象」概念的一点点心得

(面试)关于简单工厂、工厂、抽象工厂模式学习心得 前言所谓简单工厂,工厂,抽象工厂。当我一开始看到并学习这个这三个概念的时候就感觉这三个感念很相似,有点混乱,事实证明,确实让我变得很混乱。即使当初学的时候勉强看懂,但是事后便抛诸脑后,统统忘记到九霄云外了。因此当我回过头从新理解概念时,总结了以下心得,加深理解,并且做一个备忘录。工厂类模式设计的核心是:让“生产”和“产品”解耦。简单工厂所谓的简单工厂,我的理解是不用管是什么产品,我们将所有产品的生... 阅读详情

关于抽象,是面向对象的特性,之前实际写代码的时候,可能注意得不是很好,对于这个点的理解也不是很到位。

但是因为公司项目涉及到了组件化,不同组件之间的通信其实是依赖抽象接口来规范的,或者说是约束的。

而一开始,我在定义抽象接口的时候,就处理得不是很好,偶尔会把具体业务层的实现带到接口定义之中,虽然觉得这样有点不对劲,但是却无法参透。

后来,在 code review 的时候,我的导师针对我的问题跟我聊了聊,在受到点拨之后,我感觉我对此的认知有了些许进步。

说得简单的,就是:

抽象层不应该对外暴露具体的实现参数,即不是面向实现编程,而要面向抽象编程。

因为对于抽象层来说,并不应该关心具体的实现,只需要做到 “定义”,至于业务层具体怎么实现,那是业务的事,在外人看来,只需要根据抽象层对外暴露的对应的接口方法能够实现目的即可。

而且对于抽象层来说,要做到替换业务层的实现,对外是无感知的,但是如果抽象层参杂了业务层的东西,那还怎么做到替换业务层的时候对抽象层不产生影响。

比如我对外定义一个抽象接口 IPageService,里面有个抽象方法 toUserInfoPage(),用于表示跳转到应用的用户信息页。

但是,在具体的实现中,假设有两种情况,一种是用户信息页实际上在首页的一个 tab 项,假设是第 X 个 tab,那跳转到个人信息页此时就对应跳转到首页第 X 个 tab 的逻辑;第二种则是用户信息页是一个二级页面,那此时的逻辑则是跳转到对应的 Activity。

此时,如果抽象层没有定义好,针对第一种情况,则可能会将形参 Int index 也带入到 IPageService#toUserInfoPage() 方法中,从而变成,fun toUserInfoPage(index: Int),用来在实现类 IPageImpl 中通过参数 index 来指定跳转到首页第 X 个 tab(即个人信息页)。

interface IPageService {
	fun toUserInfoPage(index: Int)
}

class PageFirstImpl: IPageService {
	fun toUserInfoPage(index: Int) {
		// use index jump to user info tab
	}
}

这种情况下,其实就是对外暴露了业务层的实现,而且调用的时候必须要指定 index 为 X 才能达到目的。

val pageService = PageFirstImpl()
// should introduce X, and should know index be X
pageService.toUserInfoPage(X)

之后,如果要该成第二种实现,此时参数 index 就相当于摆设了,不会有丝毫用处。

class PageSecondImpl: IPageService {
	fun toUserInfoPage(index: Int) {
		// start UserInfoActivity, index is useless
	}
}

而正确的实现应该是像下面那样,在具体的实现类中直接指定 X 即可,因为外部调用时根本是不需要知道的,只要能够实现跳转到用户信息页即可。

interface IPageService {
	fun toUserInfoPage()
}

class PageFirstImpl: IPageService {
	fun toUserInfoPage() {
		val index = X
		// jump to user info tab via local variable ‘index’
	}
}

再补充一点,即不要本末倒置地先去想到业务层应该怎么实现,再根据实现去定义抽象层的接口方法,这个时候就会被业务层的参数给影响到。

反激变压器反射电压详解 我以前做过隔离式的POE模块,其电路实际就是个反激式开关电源。只不过其输入电压范围比较低,为44V-57V。 电路如下图,就是个flyback。 可以看到,电路中有个钳位电路,用来抑制电压尖峰,就在初级线圈那里。 问题 抑制尖峰通常有2种电路,一种叫RCD钳位,另外一种是用TVS管+二极管钳位。 这两种实际中都有用,今天我不想讨论它们的区别,只想说明一个问题: 为什么不能只用一个二极管搞定?像继电器电路那样?不也能抑制尖峰吗? 答案自然是不行的... 阅读详情

相关推荐

[附源码]计算机毕业设计JAVA网上花店系统

附源码]计算机毕业设计JAVA网上花店系统项目运行环境配置:(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat。

ssm毕设程序设计 2442

聊一聊代码中的抽象

抽象是编写代码的基础,有效的认识代码中的抽象,对我们做设计模式和架构的选择都有好处。 据我所知的抽象分为3种: 过程抽象 数据抽象 控制抽象 过程抽象 过程抽象是最常用的一种抽象,它是消除系统中重复代码头号方法。 例如,在一个App的页面上,当页面打开时,会加载数据;在App重新唤起时,会重新加载数据;当用户点击某个按钮时,会加载数据; 面对这种情况,我们通常会把这段代码抽象出来,将其放在一个函数中。从而避免了这段代码在多个事件中重复出现的情况。这样做的好处是当数据加载的逻辑有变化时,修改的地方会被限制

欢迎来到我的博客!我是一名拥有20年以上经验的系统架构师。作为一名技术爱好者,我相信技术的力量可以改变世界。 939

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照下面进行详细步骤说明,感兴趣的同学可以看一下: 1简单示例(一条线): 2.数据源随着时间不断变化,进度条变化 。多条线: 3.看在整段时期内的数据大体图(消去或出现)进度条: 4.后台将时刻记录变化记录到一个txt文本里以供详细校验: 话不多说上码: using System; using Sys...

帅boy的博客 4308

代码的抽象三原则

软件开发是"抽象化"原则(Abstraction)的一种体现。所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。 开发软件的时候,一方面,我们总是希望使用别人已经写好的代码,另一方面,又希望自己写的代码尽可能重用,以求减少工作量。要做到这两个目标,这需要"抽象化"。最近,我读到美国程序员Derick Bailey的一篇文章,谈到"抽象化"应该遵循的三个原...

weixin_30666753的博客 236

为R720安装iDRAC Service Module

这玩意找了好久资料, 教程都不咋靠谱, 要不就是有不理解的地方 所以直接一路莽着过河: 去官网找到设备对应的驱动程序: 几个查找筛选项看图 官网链接: https://www.dell.com/support/home/zh-cn/product-support/product/poweredge-r720/drivers 在下方的列表中找到对应系统版本的驱动并下载: 由于安装的系统为ESXi 6.5 U2 Dell定制版, 这里没有刚好的驱动, 所以下了个兼容的: 下载好后是一个压缩包:

Janus 6361

手把手教你解决uniapp中esbuild版本冲突问题(Mac版专属指南)

本文是针对Mac平台uniapp开发者的专属指南,详细解析了运行项目时常见的`Cannot start service`错误,即esbuild的Host版本与binary版本不匹配问题。文章从错误根源入手,提供了从快速应急处理到彻底根治的完整解决方案,包括手动替换二进制文件、锁定依赖版本、清理缓存及优化工具链配置,旨在帮助开发者高效解决版本冲突,恢复并稳定开发环境。

i0j1k2l3m的博客 458

有关RecyclerView.Adapter 的 notifyItemChanged(int position, @Nullable Object payload) 方法

今天在看某个项目的源码的时候,无意间看到了 RecyclerView.Adapter 的 notifyItemChanged(int position, @Nullable Object payload) 方法,以前没有见过,后来自己查来之后,才知道这个是与 RV 的 Item 局部刷新有关的。 平时一般是用 notifyItemChanged(int position) 方法来进行局部刷新,但...

一个有思想的搬运工 2万+

MFC 修改CheckBox的文本颜色方法

设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND

Kim的博客 2248

notifyItemChanged(int position) 引起的返回时RecyclerView页面不自然的跳动

问题如图显示 产生从详情返回至列表页时,下方的Item有个向上的动画。我在返回的同时有发一个eventBus,其中我调用了notifyItemChanged(int position)方法,我首先想到的是添加mRecyclerView.getItemAnimator().setChangeDuration(0);此方法(因为以前发生过页面闪的动画),但是很不幸的是加了此代码之后还是会有此问题。

s939432817的专栏 6271

别再只看K线了!聊聊“板块联动”和“热点轮动”的跟踪方法与工具(实战派分享)

本文深入解析了如何通过板块联动和热点轮动构建高效交易系统。从三维验证框架到主流工具配置,再到持续性热点的五大特征,实战派交易员分享了识别市场主线和预判轮动方向的高阶技巧,帮助投资者摆脱单纯依赖K线的局限,提升交易决策效率。

weixin_29281941的博客 756

Cocos Creator实战:5步搞定棋牌游戏大厅场景开发(附完整代码)

本文详细介绍了使用Cocos Creator 3.8开发棋牌游戏大厅的5个关键步骤,包括工程配置、动态UI系统实现、核心交互功能开发、性能优化及调试发布技巧。通过模块化代码和实战案例,帮助开发者快速构建高交互性的棋牌游戏大厅,提升用户留存率。

weixin_29002209的博客 353

如何做代码抽象设计,多种设计模式的应用【四种抽象方式,干货附上代码】

代码这种东西,机器不管你写的怎么样,肯定能识别, 人就不一样了,前人拉屎后人踩屎,一坨认栽,n坨就有点过分了哈一般写代码也不用太高大上,很多接口还是很简单的,如果把各种设计模式搞上来那叫过度设计,叫逼王;就在多渠道,多河流的时候才能当逼王看到过几位写的不错的同事搞的设计,和大家简单介绍一下下面介绍下这三种方式。

洛雪 1209

android11.0 Launcher3 高端定制之循环滑动

待机界面可以向左、向右循环切换页面 效果图 修改清单 packages/apps/Launcher3/res/values-zh-rCN/strings.xml packages/apps/Launcher3/res/values/config.xml packages/apps/Launcher3/res/values/strings.xml packages/apps/Launcher3/res/xml/launcher_preferences.xml packages/apps/Launc

cczhengv 1544

设计心得——抽象

摘要:抽象是从具象事物中提取本质特征的思维过程,在计算机领域表现为代码和设计思想的提炼。文章阐述了抽象的发展历程,从文字演化到编程应用;解析了表征性和原理性两种抽象类型;指出编程中抽象的应用价值在于解耦、封装和提升可维护性;强调优秀架构师需要兼具思想抽象和代码抽象能力。最后提出掌握抽象的方法论:持续学习理论并反复实践验证,才能实现从开发到设计的思维跨越。(148字)

fpcc的专栏 1126

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

我学抽象代数的心得

我学抽象代数的心得 2007-11-07    yinzhe    博士家园论坛   

cryptoleadtek的专栏 4669

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java抽象类终极心得

Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。 父类包含了子类集合的常见的方法,但是...

RK 823

抽象与接口心得

抽象与接口心得知识点Object类抽象&&接口 知识点 抽象,Object类,接口 这一块的理论只是相当的多…让我很苦恼???? Object类 Object类是所有Java类的根基类,所有类默认都是继承Object类。 ==与equals   使用“==”时如果判读的是基本类的数据就是单纯比较值,如果判读的是引用类型的数据﹑比较的是对象的内存地址值   使用“equals”时,默认的equals其实和“==”效果是一样的,但如果重写了equals方法,就不会比较内存地址,只会比较两

weekeight 433

接口,抽象类,类使用心得

今天说说接口,抽象类,类的使用心得 接口: 定义准则(模版) 定义全局属性 定义方法 抽象类: 实现接口中定义的通用方法,所谓通用就是指所有子类使用此方法业务逻辑一样 不实现接口中定义的不通用方法,所谓不通用就是指所有子类使用业务逻辑不一致,只是部分子类一样,留给子类自己实现(或 实现个基本逻辑,留给子类@Override 也行) 增加新的抽象方法 增加新的方法 类: 实现不通...

chy2z的专栏 288

抽象代数学习心得

正在学习抽象代数,但不知抽象代数的学习方法和具体的存在意义(虽然老师和我们说抽象代数能解决很多问题,但他还是没有演示给我们看到底如何怎么解决,还停留在一个抽象认识的层面),网上搜索时发现这篇文章,转载分享。   这是我个人的一篇随谈性的文章,目的是和大家一起分享我学习抽象代数的体会。我只是一个刚学完抽象代数没多久的本科生,这篇文章自然谈不上什么含金量。不过我也曾长期处于菜鸟的阶段,也曾经苦闷过

记路 1万+

Java学习心得之抽象类

一、抽象类介绍 下面通过一下的小程序深入理解抽象类   因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public abstract void enjoy();    从某种意义上来说,抽象方法就是被用来重写的,所以在父类声明的抽象方法一定要在子类里面重写。如果真的不想在子

寒风中的信 441

【巩固Java基础】抽象,一个Java程序员的面试心得

①接口不能有静态代码块,且不能写构造方法②一个类可以同时实现多个接口,但父类只能有一个:即“单继承、多实现”☆④实现类习惯写成以Impl结尾的形式 ☆⑤如果实现类所实现的多个接口中,存在有重复的抽象方法,那么只需要覆盖重写一次即可⑥如果实现类所实现的多个接口中,存在有重复的默认方法,那么必须对重复的默认方法重写(不考虑静态方法)​ **这种情况重写默认方法后 就不能调用到接口中的默认方法 **小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

m0_60721860的博客 828

JAVA学习心得——抽象类

首先复习一下多态。 在继承\重写的条件下: 父类(Mammal.java)程序: 子类(Whale.java)程序:(继承父类并重写move方法) 另外一类(Earth.java)程序: 在Earth.java中,语句` Mammal mammal =new Whale(); mammal.move(); mammal表面上是调用父类的方法 其实因为mammal变量保存了new Whal...

low1101的博客 583

设计ADT(抽象数据类型)过程中的若干概念与心得体会

(1)对spec,rep,RI,AF等ADT相关的概念的简单介绍 (2)一些个人对ADT设计的体会感受

Platium_的博客 678

Java 学习必备:易混淆概念、常见 bug 及实战心得汇总

本文分享了Java学习历程中的关键经验:1)环境配置与面向对象设计的概念解析,强调理论学习与实践结合的重要性;2)通过图书管理系统项目实践,展示了需求分析、MVC架构设计到测试优化的完整开发流程;3)详细剖析了==与equals()、值传递与引用传递等易混淆概念;4)提供了空指针异常等常见问题的解决方案;5)总结了持续学习、社区互动、良好编程习惯等成长经验,为Java学习者提供了系统的学习路径和实用建议。

2503_92211933的博客 1131

个人关于抽象类限制的学习心得,希望大家会喜欢

package cm.abstracts.limit; //这个类用来测试static定义的内部的抽象类,其作用是一个外部抽象类 public class ModelFfourtyOne { public static void main(String[] args) { //使用抽象类必须通过创建抽象类对象,创建抽象类对象必须通过子类对象的向上转型 Surface.Inward si = new Outside(); si.ful(); } } //创建抽象类:外部抽象类,外部父类 a

YanShun_Java的博客 296

学各新东西的心得体会

学东西卡着了可以看看,心得分享。

Akhis的博客 637
上一篇: 私有内存、Dalvik Heap 与 《Android 性能优化&内存篇》
下一篇: Android 手机存储相关内容
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值