ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧,总结和归纳日常工作中遇到的知识点 Share:分享一篇有观点和思考的技术文章
Algorithm
完成leetcode算法第678题。
现在还不会贪心算法和动态规划。所以用栈的方式先实现了一遍,到时候学完其他两种写法再复习这道题。
package com.ohyoung.leetcode.stack;
import java.util.Stack;
/**
* 给定一个只包含三种字符的字符串:(,)和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
*
* 任何左括号 (必须有相应的右括号 )。
* 任何右括号 )必须有相应的左括号 (。
* 左括号 ( 必须在对应的右括号之前 )。
* *可以被视为单个右括号 ),或单个左括号 (,或一个空字符串。
* 一个空字符串也被视为有效字符串。
*
* 示例 1:
*
* 输入: "()"
* 输出: True
* 示例 2:
*
* 输入: "(*)"
* 输出: True
* 示例 3:
*
* 输入: "(*))"
* 输出: True
*
* @author ohYoung
* @date 2021/9/12 10:01
*/
public class CheckValidString678 {
private boolean checkValidString(String s) {
// )(是非法的 --> 括号的匹配和顺序有关, 所以stack存储的是每个字符在字符串中的下标用来判断括号的顺序是否合法
Stack<Integer> left = new Stack<>();
Stack<Integer> general = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
left.add(i);
} else if (c == '*') {
general.add(i);
} else {
if (!left.isEmpty()) {
left.pop();
} else if (!general.isEmpty()) {
general.pop();
} else {
return false;
}
}
}
// 如果左括号和*都还存在, 将*看作右括号和左括号进行匹配, 同时注意顺序
while (!left.isEmpty() && !general.isEmpty()) {
if (general.pop() < left.pop()) {
return false;
}
}
return left.isEmpty();
}
}
Review
Domain Primitives: what they are and how you can use them to make more secure software
什么是Domain Primitive,怎么利用它使得我们的软件更安全。
- 用强类型代表带有业务含义的参数,比如用PhoneNumber代替String
- 校验规则写在对应的强类型对象中,保持单一原则
-
Tip
orm框架替换后,如何避免大量代码修改的情况?
我们的代码进入到dao层的时候,通常会用mybatis或JPA等一些框架提供的方法和数据库进行交互。示例代码如下: ```java // JPA的repository层 public interface MdCurrencyRepository extends BaseRepository{ public MdCurrency findByName(String name); }
// dao层调用 @Autowired private MdCurrencyRepository currencyRepository;
public MdCurrency getByName (String name) { return currencyRepository.findByName(name); }
如果我们的orm框架没有替换,代码不会有任何问题。但是如果框架由于某种原因需要替换成Mybatis,所有使用到currencyRepository.findByName(name);的代码都需要替换掉,影响范围大。这时候我们可以用**面向接口编程**的方式去解决。首先我们定义一个接口:
```java
public interface MdCurrencyDao {
public MdCurrency findByName(String name);
}
然后定义实现类:
public class MdCurrencyDaoImpl implements MdCurrencyDao{
@Autowired
private MdCurrencyRepository currencyRepository;
public MdCurrency findByName(String name) {
return currencyRepository.findByName(name);
}
}
客户端调用:
public class MdCurrencyService {
@Autowired
private MdCurrencyDao currencyDao;
public MdCurrency findByName(String name) {
return currencyDao.findByName(name);
}
}
这样就算我们替换了orm框架,我们只需要将MdCurrencyDaoImpl中的jpa替换成mybatis的实现就行,客户端调用的方法一个字都不用改动,影响范围小且可测试性强。
Share
输出文章 - DDD系列(一):Domain Primitive
Finish
预计完成时间:2021.09.06 ~ 2021.09.12
实际完成时间:2021.09.12