代码基础笔记

来源: https://www.worthpen.top/blog?id=6566174a6aa58e39d9301934

1 编程规范

1.1 语言的选择

(1)Android端:使用Flutter开发
(2)IOS端:使用Flutter开发
(3)WEB端:使用Flutter开发
(4)桌面端:使用Flutter开发
(5)科研仿真:使用linux下的python开发
多维度衡量两种语言在科学计算方面的性能,每个维度分为三个档次,分别对应1、2、3的得分

面向对象特性计算准确度打包为exe便捷度GUI开发便捷度打包exe的运行速度总分
Matlab2333112
Python3311311

针对表格的解释:Matlab面向对象功能不完善,必须继承handle成员函数才能修改成员变量;python生成可执行文件需要自己导入依赖库的依赖库,使得导入复杂,打包过程复杂;matlab运行exe需要先运行matlab运行环境,首次启动慢。
linux和windows在运行结果方面相同,; linux便于使用他人现成的代码; linux便于将代码放于云上处理; windows上tensorboard有BUG, 会导致显示不全, 可能是由于使用了linux训练出来的结果或者linux记录的数据不全导致的, 使用自己训练的结果就不会出现问题, 但是不论原因是什么, 都比linux差, linux可以完美的展示数据.
因此, 在进行深度学习方面的项目时, 使用limux下的python进行开发. 当需要基于科研代码生成桌面应用时, 使用flutter开发桌面应用, 再将matlab或python转化为c的dll库嵌入flutter应用中.

1.2 对于不同模块不同时间间隔的仿真方法

对于不同模块不同时间间隔的仿真,使用最小时间间隔进行仿真。对于较大时间间隔的模块使用判断语句,在为时间间隔的整数倍时运行该模块。

1.3 编程时不能使用不明确的编号

如表示矩阵中整列不能使用“:”,而要用“1:3”

1.4 必须进行函数说明

每个函数应在开始注明输入量的含义、输出量的含义、函数功能

1.5 命名规则

(1) 遵循变量名详细,但也不要过多冗余,能看出是什么功能即可;
(2) 关于大小写问题;
如果有规范,则按照规范;否则程序内尽量使用下划线命名; 文件系统命名使用小写加下划线; 网址尽量使用小写加下划线。
原因:不同系统对命名大小写有不同敏感程序,如,Windows不区分大小写,Linux区分大小写

1.6 等待修改的地方做TODO标记

1.7 输入与参数区别

输入为模型的动态输入,参数为模型的固有量。参数应该在模型的开始给出,并通过代码分块与程序或者其他部分区分开。

1.8 多用方法

多用方法方便复用。需要复用时必须用方法。实际上谁也说不准将来是否复用,因此必须用方法。还能便于功能隔离,理解代码。依赖时需要用方法,可以在依赖变化时便于更改。

1.9 开发过程中的输入法设置

对于中文使用者, 开发过程中, 不可避免需要频繁切换汉语输入和英语输入, 这会导致输入与自己想要输入的语言不同的情况, 需要进行删除, 消耗时间.
可以在输入过程中全部使用汉语输入法, 并设置在使用汉语输入法的过程中同样使用英文标点符号. 当需要输入英文时, 直接在汉语输入法中输入英文, 点击回车则不会生成汉语, 而是直接输入英文.

1.10 推荐插件库

(1)markdown editor
(2)rainbow CSV

2 语言的概念

2.1 语言的特性通常包括

与硬件的关系(编译成机器语言后如何分配硬件):线程 内存处理
与语言本身相关:数据类型 函数 运算符 流程控制 类 其他细节(异常捕获、泛型等)

2.2 脚本语言和编程语言的区别

脚本语言对应的是解释型,编程语言对应的编译型。脚本语言执行快速。

2.3 元数据

元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等。
元数据是关于数据的组织、数据域及其关系的信息,简言之,元数据就是关于数据的数据。

2.4 类型推断

类型推断可以在编译期间推断出变量类型。

2.5 进程、线程的概念

进程是分配内存资源的最小单位。
线程是分配CPU资源的最小单位(程序中的线程)。
一个进程可以包含多个线程。也就是说,线程属于进程的一部分。
程序的线程和CPU的线程是不同的概念。
CPU多线程(超线程):我们先看CPU是如何处理指令的。通俗的说可以分成两部分,第一部分是负责读取指令,第二部分是负责执行指令。一般执行部分是非常复杂的,通俗的来讲,比如加减乘除等需要不同的执行机构,一套执行机构要包括多种运算法则的执行单元。通常的CPU是读取部分和执行部分一对一的,而超线程的CPU则是多个读取部分和一个执行机构对应的,也就是说一个核心里有好几套的读取机构和一套执行机构。超线程的优势:首先读取机构1和读取机构2分别读取不同的指令,假设指令1是乘法,指令2是加法,那么CPU就可以调用一套执行机构中的不同部分来同时处理;而对于部支持超线程的CPU,执行指令1时尽管加法执行单元是空闲的但是也只能等指令1执行完成之后且指令2读取完毕后才能执行。在这种情况下多线程效率接近多核。

2.6 同步、异步、阻塞、非阻塞

同步和异步是针对方法的先后顺序定义的,具有严格顺序的方法是同步,否则是异步。而阻塞非阻塞是针对已经运行的方法的返回值定义的,阻塞的方法会等待执行完成后返回,而非阻塞的方法会立即返回,等待完成后通知或者等调用者主动查询去获得真正的返回值。

2.7 挂起

将进程清理出内存并保存,等合适的时候,再将其调回

2.8 抢占式调度和非抢占式调度

非抢占式调度是在进程开始后,就一直执行,直到结束或者阻塞。
抢占式调度是根据优先级来决定运行哪个程序。

2.9 结构化语言和非结构化语言

结构化语言有三种基本结构,顺序,选择,循环,是采用模块化开发的程序设计语言,具有单一入口单一出口。
汇编语言是非结构化语言,用goto转跳,不是只有单一入口单一出口。

2.10 初始化列表是什么

初始化列表是在执行类的构造函数前执行的一个步骤。对类类型的量执行构造函数。

2.11 字面量是什么

字面量就是指这个量本身,比如字面量3,也就是指3。再比如String类型的字面量"ABC"。虽然很难下定义,你就理解成一眼就能知道的量。对比下String x;那么x是多少呢?它是个变量,你不确定它的值。但是String x=“ABC”,你当然知道"ABC"就是"ABC"了,一眼就能看到值的量(有点像常量)。String x="ABC"意思是把字面量"ABC"赋值给变量X.再举例const String y=“cbd”.意思是把字面量"cbd"赋值给了常量y.明白了吧?总之就是描述自己的量。"ABC"它描述了自己,你看到了就知道它是"ABC"了。

2.12 函数参数的显示传递和隐式传递是什么

(1)通过函数的参数显示传递:
A(int a){
a = a+2;}
B(void){
int b = 3;
A(b);}
在函数A中a作为一个参数传入函数中进行运算,那么a就可以算作是A的输入,然后在程序内部a进行了运算后值变了,那么运算后的a又算作是A函数的输出。
(2)通过全局变量隐式传递:
全局变量你应该知道吧,简单点说就是作用域涵盖整个程序的变量(当然要看具体情况)。
假设a为int型全局变量,初始值为1:int a = 1;
A(){
a = a + 2;}
B(){
a = a + 3;}
main(){
A();
B();
A();}
通过main函数我们可以看到,程序首先执行的是函数A,那么执行完函数A后全局变量a的值由初始值1变成了3,然后又继续执行函数B,注意此时函数B也是对a进行运算,那么此时全局变量a成了B的输入,运算后a的值为了6,此时a为B的输出。那么也就是说全局变量a在经过A函数的改变后作为一个输入隐式的传入了B函数,然后经过B函数的运算又算作是B的输出。执行过B函数后程序又遇到了A函数,那么此时经过B函数运算的a又作为A函数的一个输入了。

2.13 正则表达式是什么

正则表达式代表了一组字符串,本身不具备匹配能力,但是通过匹配方法,可以判断出一个字符串是否符合该正则表达式,即包含在正则表达式所代表的一组字符串中。

2.14 转义字符

所有的ASCII码所代表的字符都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符所代表的字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符所代表的字符意思了。
字符串可以通过 e x p r e s s i o n 的方式内嵌表达式。也相当于转义符,把 e x p r e s s i o n 转义为表达式 e x p r e s s i o n 所代表的字符串,而不是字符串 {expression} 的方式内嵌表达式。也相当于转义符,把expression转义为表达式expression所代表的字符串,而不是字符串 expression的方式内嵌表达式。也相当于转义符,把expression转义为表达式expression所代表的字符串,而不是字符串{expression}本身或者expression本身。

2.15 检查型异常与非检查型异常

(1)检查型异常(Checked Exception)
所谓检查(Checked)是指编译器要检查这类异常,检查的目的一方面是因为该类异常的发生难以避免(将来肯定出错),另一方面就是让开发者去解决掉这类异常,所以称为必须处理(try …catch)的异常。如果不处理这类异常,集成开发环境中的编译器一般会给出错误提示。
(2)非检查型异常(Unchecked Exception)
所谓非检查(Unchecked)是指编译器不会检查这类异常,不检查的则开发者在代码的编辑编译阶段就不是必须处理,这类异常一般可以避免,因此无需处理(try …catch)。如果不处理这类异常,集成开发环境中的编译器也不会给出错误提示。

2.16 Exception和Error的区别是什么

首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception和Error体现了JAVA这门语言对于异常处理的两种方式。
Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。
Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。

2.17 语法糖

语法糖(Syntactic sugar)指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

2.18 抛出异常的后果

导致抛出异常的代码终止执行。如果该代码不影响整体,则只种植该代码,如果影响整体,则程序终止。

2.19 动态类型、静态类型

动态类型语言:是指在运行期间才去做数据类型检查的语言。在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言;
静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、Java都是静态类型语言的典型代表。
动态、静态区分的时数据类型检查的时机。

2.20 强类型语言、弱类型语言

强类型语言:使之强制数据类型定义的语言。没有强制类型转化前,不允许两种不同类型的变量相互操作。强类型定义语言是类型安全的语言,如Java、C# 和 Python,比如Java中“int i = 0.0;”是无法通过编译的;
弱类型语言:数据类型可以被忽略的语言。与强类型语言相反, 一个变量可以赋不同数据类型的值,允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。C/C++、PHP都是弱类型语言,比如C++中“int i = 0.0;”是可以编译运行的;
强弱区分的时数据检查的严格程度。

2.21 类型安全

指访问被授权可以访问的内存位置。例如,类型安全代码不能从其他对象的私有字段读取值。它只从定义完善的允许方式访问类型才能读取。
有些地方不仅指内存问题,同样也指类型问题,如果类型安全,则无法使用其他类型当作输入。

2.22 回调函数

回调函数是函数的实现和调用不在同一处。和异步调用无必然联系。

2.23 异步调用的实现方法

回调函数
向被调用方法传入回调函数,在被调用方法执行完成后,执行回调函数,回调函数由调用者定义,就可以实现得到被调用方法的结果。

2.24 向上转型

转型为父类后不可以直接调用子类特有的函数,但是在父类的函数中可以调用。

2.25 闭包是什么

闭包相当于把变量和函数进行打包,使其可以在变量的作用域外进行使用。常用在赋值Function类型时

2.26 脚本的定义

通常意义上来讲是大纲或者最原始的稿件。在计算机中为不需要编译的语言,依赖解释器运行。

3 其他概念

3.1 JRE、SDK、JDK、API、类库、框架、IDE区别

JRE:英文名称(Java Runtime Environment);
SDK: 是程序的工具包,可以提供多个API,但是api也可以不是SDK提供的,某个软件不是工具包,也可以提供API。JDK的英文名称为JAVA Development Kit, 属于SDK的一种;
类库:封装好的代码,通过调用开放出的API获取相应的功能;
框架:也是封装好的代码,不过会功能更加多样,一个框架会包含多个类库或SDK,并且框架面向的顶层的开发,可以开发出整套的软件或程序,而类库更多的是面向底层的开发。
IDE:集成开发环境(Integrated Development Environment),如Android studio。

3.2 数据库相关知识

关系模型:一张二维表,数据库中的表就是一个关系模型,它将表中的各个属性联系起来,形成了数据库。数据库中的一条数据就是一个关系。关系模式是对关系的描述,关系是关系模式的一个状态或者内容。比如小红和小明的学号分别是1和2,将他俩的信息输入到一个数据库中,数据库有两个属性,姓名和学号,关系指的是名字小红和1学号形成关系,组成小红这个人物实体,而不是小红和小明都是学生,组成学生关系。该例中的姓名和学号就是关系模式。

3.3 版本控制

版本控制分为三个部分,工作空间、本地库、远程库。平时操作代码的地方就是工作空间。
Checkout from version control和clone的作用一样。
Fetch是将远程库同步到本地库;pull是将远程库同步到本地库,并将本地库合并到工作空间。
commit是将工作空间同步到本地库,push是将本地库同步到远程库。
merge命令和rebase命令都是将两个分支进行合并。具体区别见https://blog.csdn.net/liuxiaoheng1992/article/details/79108233。
git rebase --onto A B C。A代表的是你实际想要将切片放到哪的分支,B代表切片开始分支。C代表的是切片的末尾。

3.4 配置环境变量的原因

CSDN/通用/JAVA为什么要设置环境变量

3.5 设计模式是什么

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

4 问题

4.1 类方法返回值为对象的问题

私有属性一般是不能直接调用和修改的。那么1、返回值为对象时是引用传递还是完全拷贝(深拷贝)一份对象?2、在引用传递的情况下,如果方法返回值是私有对象(在class中为private old-object),那么是否可以通过返回值赋值给new-object然后修改new-object直接修改私有对象(通过class.old-object)。
经过验证,将返回的私有对象(old-object)赋值给新对象(new-object),相当于引用传递,即把类地址给新对象。可以通过调用新对象,修改原先的对象(old-object)中的public属性(private显然不能修改,任何情况都不行)。也就是说,实现了private对象的直接访问,但私有对象中的私有属性不能访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoilingHotPot

听说打赏我的人,都发顶会顶刊了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值