第二周训练营总结

第二周的架构师训练营结束了,这周很多东西都还没有好好复习。

一、计算机的发展史

早在1700 年,计算机还没有诞生的时候,程序语言就已经诞生了,当时莱布尼兹就期望将各种事物都通过一种逻辑语言进行描述。随后人类将这种编程思想用在纺织机上,用在纸带机上,直到第一台计算机诞生,再到随后形形色色的编程语言出现。
从汇编语言,到 basic 语言,再到现代的高级语言,人们不断进化计算机和编程语言,用他们来解决现实世界的问题,发展现代的工业。
当产品经理给你提了需求,你用 Java 语言来实现的时候,有没有思考过,你已经是站在巨人的肩膀上来解决问题了呢?若是没有前人的成果,我们该怎么办。

二、什么是面向对象

说到面向对象,就不得不提到面向对象的三要素:封装、继承和多态。
面向对象可以让系统强内聚,低耦合,从而使系统:

  • 易扩展,易于增加新的功能
  • 更强壮,不容易被粗心的程序员破坏
  • 可移植,能够在多样的环境中运行
  • 更简单,容易维护

三、设计原则

我们在面向对象过程中,应该遵循下面的设计原则

  • 开闭原则
    对于扩展开放,对于修改关闭
    使用设计模式来去除掉代码中的if else,面向接口编程,使得系统更加的健壮

  • 依赖倒置原则
    高层模块不应该依赖底层模块,而是大家都依赖抽象
    抽象不应该依赖实现,而是实现依赖于抽象
    那么,倒置的是什么?倒置的是模块和包的依赖关系,说白了,就是高层组件来定义他们想要的接口,底层组件来实现。而不是底层组件为了抽象,而去实现高层组件的接口。这两种情况的职责是不一样的。一个是高层来定义规范,底层实现,一格是底层实现,让高层用。这二者的职责不一样。

  • 好莱坞原则
    你不要来找我,我会打电话给你
    好莱坞原则,是说底层组件挂靠在高层组件上,由容器来调用或者取得底层组件。这样底层组件可以轻易的升级和更改。

  • 里氏替换原则
    子类型必须能够替换掉它们的基类型
    也即是说,子类型尽量不要复写父类的方法
    子类型的访问控制不能比父类严格

  • 单一职责原则
    一个类,只有一格引起它变化的原因。一个类,尽量只负责一件事情。
    这个原则,也是我们编程中,通常会遵循的内容。

  • 接口隔离原则
    不应该强迫客户依赖它们不需要的方法

四、设计模式

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

结构型模式,共七种:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

五、一点思考

架构师,应该熟悉常用的设计模式,并且应该看一看经典框架(spring)源码,体会里面设计模式的使用。
在平时编码中,尽量让自己养成代码洁癖的习惯,眼里容不得坏代码,定时去查看自己写过的旧代码,看看哪里是不是能用设计模式优化。
让设计模式内化成我们骨子里的东西,一种境界就是,我在写出设计模式代码的时候,不会意识到已经使用了设计模式,而是代码就应该这么写,哈哈,架构师们,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,使得子数组的和大于等于给定的目标值。这里可以使用滑动窗口的方法来解决问题。使用两个指针来表示滑动窗口的左边界和右边界,通过移动指针来调整滑动窗口的大小,使得滑动窗口中的元素的和满足题目要求。具体实现的代码如下: ```python def minSubArrayLen(self, target: int, nums: List[int]) -> int: left = 0 right = 0 ans = float('inf') total = 0 while right < len(nums): total += nums[right] while total >= target: ans = min(ans, right - left + 1) total -= nums[left] left += 1 right += 1 return ans if ans != float('inf') else 0 ``` 以上就是第二十二天的算法训练营的内容。通过这些题目的练习,可以提升对双指针和滑动窗口等算法的理解和应用能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值