2022.3.31上海浦东初创团队一、二面的知识点总结

Promise

什么是promise?

promise出现的原因

 参考:(2条消息) 详述Promise的使用(前端必备)_alt鱼的博客-优快云博客_前端promise

 axios和fetch的写法以及区别

 

 关系型数据库和非关系型

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

迅捷开发

什么是迅捷开发?

敏捷开发(Agile)是一种以人为核心、迭代、循序渐进的开发方法。

在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。

简单地来说,敏捷开发并不追求前期完美的设计、完美编码,而是力求在很短的周期内开发出产品的核心功能,尽早发布出可用的版本。然后在后续的生产周期内,按照新需求不断迭代升级,完善产品。

敏捷开发模式的分类

敏捷开发的实现主要包括 SCRUM、XP(极限编程)、Crystal Methods、FDD(特性驱动开发)等等。其中 SCRUM 与 XP 最为流行。

同样是敏捷开发,XP 极限编程 更侧重于实践,并力求把实践做到极限。这一实践可以是测试先行,也可以是结对编程等,关键要看具体的应用场景。

SCRUM 则是一种开发流程框架,也可以说是一种套路。SCRUM 框架中包含三个角色,三个工件,四个会议,听起来很复杂,其目的是为了有效地完成每一次迭代周期的工作。在这里我们重点讨论的是 SCRUM。 

SCRUM 的工作流程

学习 Scrum 之前,我们先要了解几个基本术语:

Sprint:冲刺周期,通俗的讲就是实现一个“小目标”的周期。一般需要 2-6 周时间。
User Story:用户的外在业务需求。拿银行系统来举例的话,一个 Story 可以是用户的存款行为,或者是查询余额等等。也就是所谓的小目标本身。
Task:由 User Story 拆分成的具体开发任务。
Backlog:需求列表,可以看成是小目标的清单。分为 Sprint Backlog 和 Product Backlog。
Daily meeting:每天的站会,用于监控项目进度。有些公司直接称其为 Scrum。
Sprint Review meeting: 冲刺评审会议,让团队成员们演示成果。
Sprint burn down:冲刺燃尽图,说白了就是记录当前周期的需求完成情况。
Release:开发周期完成,项目发布新的可用版本。

面向对象的三个基本特征

面向对象的三个基本特征是:封装、继承、多态。

封装

封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承

 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
 
继承概念的实现方式有三类:实现继承、接口继承和可视继承。
Ø          实现继承是指使用基类的属性和方法而无需额外编码的能力;
Ø          接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
Ø          可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。
抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class。
OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

多态 

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
实现多态,有二种方式,覆盖,重载。
覆盖,是指子类重新定义父类的虚函数的做法。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

 如何实现多态?

一般做法是:写一个方法,它只接收父类作为参数,编写的代码只与父类打交道。调用这个方法时,实例化不同的子类对象(new 一个对象)。

更具体的说:

(1)、子类重写父类的方法。使子类具有不同的方法实现。

(2)、把父类类型作为参数类型,该父类及其子类对象作为参数转入。

(3)、运行时,根据实际创建的对象类型动态决定使用那个方法。

 Let、const、var的区别

软件工程

1、什么叫软件工程?

答:软件工程就是将系统的、规范的、可度量的工程化方法应用于软件开发、运行和维护的全过程及上述方法的研究。

2、软件工程有哪些原则?

答:抽象、模块化、信息隐藏、局部化、一致性、完整性和可验证性。

3、什么叫软件?

答:软件的定义是计算机程序及其说明程序的各种文档。

4、什么是软件生命周期?什么是软件的生命周期模型?主要有哪些模型

答: 软件生命周期是指一个软件从提出开发要求开始直到该软件报废为止的整个时期(软件分析时期、软件设计时期、编码与测试时期、运行维护时期)。

关于这个重点说一下,我们平时的编写一些程序的时候,其实就有这个时期,你想刚开始可行性研究(当然,我们一般考虑的是自己的能力和时间是否可以去做这个项目),然后我们的脑子里面有一个大概的想法(概要设计),然后有了数据结构算法(详细设计),之后就开始利用编程语言编写(编码),然后运行测试看看是否符合(测试时期),之后小的程序基本就结束了,像一般的网页或者大一点的程序,就还有运行维护阶段。

        软件生命周期模型是描述软件开发过程中各种活动如何执行的模型。

        瀑布模型、原型模型、增量模型、喷泉模型、基于知识的模型和变换模型。

5、可行性研究的任务是什么?成本效应分析是什么?

答:(1)技术可行性、经济可行性、社会可行性、操作可行性

        (2)成本效益分析是通过比较项目的全部成本和效益来评估项目价值的一种方法。

6、什么是数据流图?画数据流图需要哪些步骤?

答:数据流图是从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。

       画系统的输入/输出;画系统内部,即顶层数据流图和0层数据流图。

7、软件总体设计阶段的基本任务是什么?

答:(1)软件系统结构设计(2)数据结构及数据库设计(3)网络系统设计(4)软件总体设计文档(5)评审

10、什么是模块?什么是模块化?

答:模块是可组合、分解和更换的单元。模块化是解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。

11、什么是耦合?什么是内聚?

答:耦合表示软件结构内不同模块彼此之间相互依赖(连接)的紧密程度,是衡量软件模块结构质量好坏的度量,是对模块独立性的直接衡量指标。

  内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展
 

一个好的软件,它是低耦合高内聚的。 

 参考:整理软件工程最基本的几个概念_threecat.up的博客-优快云博客_软件工程概念

React函数式组件和类组件

React定义类组件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
  </head>
  <body>
    <div id="root"></div>
    <script type="text/babel">
      class MyComponent extends React.Component{
        render(){
          return (<h1> hello world </h1>)
        };
      }
      ReactDOM.render(
        React.createElement(MyComponent),
        document.getElementById('root')
      );
    </script>
  </body>
</html>

 两种组件的特点区别:

挂载组件 :
函数式组件:react会直接调用该函数,并自动传入props参数
class组件:react会new此组件,并自动传入props参数

更新组件:
函数式组件:更新时,会重新执行此函数
class组件:更新时,该class组件的实例会重新调用自己的render方法,也就是说原来的实例还是原来的实例。通过测试发现:更新时,constructor函数根本没执行,也就是说根本没有new出新的实例。只是原实例会重新调用自己的render方法。

多多使用函数式组件:
函数式组件没有自己的实例,并且函数式组件执行时会捕获当前时刻的props和state(闭包),因为函数式组件更新或者挂载时就是执行此函数,所以函数中定义的函数,就会有闭包现象,因为我们return了JSX出去,如果在JSX上面绑定了相应的事件。那么绑定的事件中就会捕获当前时刻的props和state。在React Hooks 中闭包是十分关键的。

js中的钩子机制

 什么是钩子机制?使用钩子机制有什么好处?
钩子机制也叫hook机制,或者你可以把它理解成一种匹配机制,就是我们在代码中设置一些钩子,然后程序执行时自动去匹配这些钩子;这样做的好处就是提高了程序的执行效率,减少了if else 的使用同事优化代码结构。由于js是单线程的编程语言,所以程序的运行效率在前端开发是比较重要的,在开发中我们秉承如果能用switch case 的地方就不要用if else 可以用hook实现的尽量使用hook机制去实现。
这里我们举一个例子看一下:
例如我们在向后台进行ajax请求的时候,后台经常会返回我们一些常见的错误码,如:001代表用户不存在,002代表用户密码输入错误。003代表用户被锁定。这个时候我们要将错误友好的提示给用户。这个时候我们该怎样实现呢?
一般的写法可能是:

$.ajax(option,function(result){
    var errCode = result.errCode ;//错误码
    if(errCode){
          if(errCode =='001'){
               alert("用户不存在")
            }else if(errCode =='002'){
               alert("密码输入错误")
            }else if(errCode =='003'){
              alert("用户被锁定")
            }
    }else{
           //登录成功
   }
},function(err){

})

这样写其实是比较low低,稍微有点经验的可能会使用switch case来实现,但是这个两种写法都无法避免一个问题就是如果我的错误码特别多,那得写多少个if else和case 啊?但是如果使用hook写法的话就会简单好多,
首先我们先声明一个错误码钩子列表

var codeList  = {
   "001":"用户不存在",
   "002":"密码输入错误",
   "003":"用户被锁定"
}
$.ajax(option,function(result){
    var errCode = result.errCode ;//错误码
      if(!errCode){
          alert(codeList[errCode]);
      }else{
          //登录成功
      }
},function(err){

})

这样写的话代码结构更加清楚明了。这个例子是最简单的应用了的了。

<think>好的,我现在需要帮用户分析他们的数据格式,并优化正则表达式来正确解析。首先,用户给出的输入格式是每行个人的信息,例如:“父亲: 欧阳 峰 1980/02/30 杭州市西湖区1号(古荡街道)” 和“养母: 李芳 1975.13.05 上海市浦东新区”。看起来每行由亲属关系、姓名、日期和地点组成,各部分之间用空格分隔。 首先,我需要确定用户的需求。他们可能希望从这种格式的文本中准确提取每个字段,比如亲属关系、姓名、出生日期和地点。用户之前已经有个正则表达式,但可能存在些问题,比如日期验证不足、地点匹配不准确、姓名冗余等。用户现在希望进步优化这个正则表达式,提高匹配的精度和鲁棒性。 接下来,我需要分析用户提供的原始正则表达式的问题。根据之前的优化方案,问题包括:日期未过滤非法值(如2月30日)、地点可能截断包含数字或符号的部分、终止条件不全面导致可能跨行匹配、以及姓名匹配过于宽松可能包含非姓名内容。 用户现在的输入例子中,日期部分存在明显的错误,比如“1980/02/30”和“1975.13.05”。这些需要正则表达式能够正确识别格式,但可能无法验证日期的有效性,因此需要在后续处理中进行额外检查。 然后,我需要考虑如何优化正则表达式。对于日期部分,需要确保月份在01-12之间,日期在01-31之间,同时支持不同的分隔符(如/-.)。地点部分需要允许中文、数字、括号等符号,并且能够处理多级地名,例如“杭州市西湖区1号(古荡街道)”。 亲属关系的终止条件需要扩展,不仅仅是“母亲”或结尾,还需要包括其他可能的亲属关系,如“养母”、“祖父”等,避免在下行开始前提前终止匹配。 姓名部分需要更加严格,限制合理的长度和结构。例如,中文姓名通常为2-4个汉字,可能有空格分隔的复姓或双名,如“欧阳 峰”。需要避免匹配过长的或包含非汉字的字符。 接下来,我需要构建优化后的正则表达式,确保每个部分都符合要求。使用命名捕获组来提升可读性和可维护性。同时,正则表达式需要处理多行输入,并正确终止在下个亲属关系标签或行尾。 测试用例的验证也很重要。例如,用户提供的例子中的错误日期应该被正确识别为格式合法但实际无效,需要在后处理中进行进步验证。同时,地点部分需要正确捕获包含数字和符号的地址。 最后,建议用户在后处理中使用日期库进行有效性检查,以及使用姓名字典过滤可能的错误。如果需要支持更多亲属关系,可以扩展正则表达式中的相关部分。此外,性能优化方面,可以考虑分块处理长文本,避免正则表达式回溯过多导致效率问题。 总结来说,用户的需求是优化正则表达式以更准确地解析特定格式的文本,需要处理各个字段的验证和兼容性,确保数据提取的准确性和可靠性。</think>以下是针对您提供的文本格式的**详细解析与正则表达式优化方案**,包含关键改进点与分步解释: --- ### **、文本结构分析** 输入示例: ```text 父亲: 欧阳 峰 1980/02/30 杭州市西湖区1号(古荡街道) 养母: 李芳 1975.13.05 上海市浦东新区 ``` **字段组成**: 1. **亲属关系**:如`父亲`、`养母` 2. **姓名**:可能含空格分隔的复姓或双名(如`欧阳 峰`) 3. **出生日期**:支持`YYYY/MM/DD`、`YYYY.MM.DD`、`YYYY-MM-DD` 4. **地点**:含中文、数字、符号的多级地址(如`杭州市西湖区1号(古荡街道)`) --- ### **二、优化后正则表达式** ```python import re pattern = re.compile( r"(?P<relationship>父亲|母亲|养父|养母|祖父|祖母)\s*[::]\s*" r"(?P<name>[\u4e00-\u9fa5]{2,4}(?:\s+[\u4e00-\u9fa5]{1,3})?)\s+" r"(?P<dob>(?:19|20)\d{2}[./-](?:0[1-9]|1[0-2])[./-](?:0[1-9]|[12][0-9]|3[01]))\s+" r"(?P<location>[\u4e00-\u9fa5\w()()-]+(?:\s+[\u4e00-\u9fa5\w()()-]+)*)" ) ``` --- ### **三、关键优化点说明** #### **1. 亲属关系匹配** - **规则**:`父亲|母亲|养父|养母|祖父|祖母` - **改进**:直接枚举合法称谓,避免模糊匹配 - **示例**: - ✅ `父亲:`、`养母:` - ❌ `叔叔:`(未在列表中) #### **2. 姓名精准匹配** - **规则**:`[\u4e00-\u9fa5]{2,4}(?:\s+[\u4e00-\u9fa5]{1,3})?` - **逻辑**: - 主名:2-4个汉字(覆盖单姓双名和复姓单名) - 可选空格分隔后缀:1-3个汉字(支持双名或中间名) - **示例**: - ✅ `欧阳 峰`(复姓+单名) - ✅ `司马 相如`(复姓+双名) - ❌ `王 A 明`(含非汉字字符) #### **3. 日期格式与有效性** - **规则**: ```regex (?:19|20)\d{2} # 年份:1900-2099 [./-] # 分隔符 (?:0[1-9]|1[0-2]) # 月份:01-12 [./-] (?:0[1-9]|[12][0-9]|3[01]) # 日期:01-31 ``` - **改进**: - 禁止`YYYY.00.00`或`YYYY/13/32`等非法值 - 兼容`1980/02/30`格式(需后续验证实际日期有效性) #### **4. 地点灵活匹配** - **规则**:`[\u4e00-\u9fa5\w()()-]+(?:\s+[\u4e00-\u9fa5\w()()-]+)*` - **允许内容**: - 中文、字母、数字、括号、连字符 - 多级地名(如`浙江省杭州市西湖区1号(古荡街道)`) - **排除问题**: - ❌ `地址: ...`(避免跨字段捕获) --- ### **四、匹配测试与结果** #### **输入文本** ```text 父亲: 欧阳 峰 1980/02/30 杭州市西湖区1号(古荡街道) 养母: 李芳 1975.13.05 上海市浦东新区 ``` #### **解析结果** 1. **第条记录** ```python { &#39;relationship&#39;: &#39;父亲&#39;, &#39;name&#39;: &#39;欧阳 峰&#39;, # ✅ 姓名结构合法 &#39;dob&#39;: &#39;1980/02/30&#39;, # ✅ 格式合法(需检查实际日期有效性) &#39;location&#39;: &#39;杭州市西湖区1号(古荡街道)&#39; # ✅ 含数字和括号 } ``` 2. **第二条记录** - `dob`字段`1975.13.05` → **匹配失败**(月份13非法) ❌ --- ### **五、后续处理建议** 1. **日期有效性校验**: ```python from datetime import datetime def validate_date(date_str): try: datetime.strptime(date_str, "%Y/%m/%d") return True except ValueError: return False ``` - 示例:`1980/02/30` → 实际无2月30日,返回`False` 2. **姓名清洗**: - 移除多余空格:`欧阳 峰` → `欧阳峰` - 验证常见姓氏(如预置姓氏库) 3. **扩展亲属关系**: ```python relationships = ["父亲", "母亲", "养父", "养母", "祖父", "祖母", "外祖父", "外祖母"] pattern = re.compile(rf"(?P<relationship>{&#39;|&#39;.join(relationships)})...") ``` --- ### **六、常见问题与解决** - **问题1**:日期格式混杂(如`1980-02/30`) **方案**:统替换分隔符 `date_str.replace(&#39;-&#39;, &#39;/&#39;).replace(&#39;.&#39;, &#39;/&#39;)` - **问题2**:地点含特殊符号(如`朝阳区#2楼`) **方案**:扩展正则表达式中的符号集 `[\u4e00-\u9fa5\w()()-#]+` - **问题3**:跨行匹配 **方案**:启用多行模式 `re.MULTILINE` 并严格终止条件 通过以上优化,可精准匹配您提供的文本格式,同时保持高可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FS9000

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值