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);的代码都需要替换掉,影响范围大。这时候我们可以用**面向接口编程**的方式去解决。首先我们定义一个接口:```javapublic interface MdCurrencyDao {public MdCurrency findByName(String name);}
然后定义实现类:
public class MdCurrencyDaoImpl implements MdCurrencyDao{@Autowiredprivate MdCurrencyRepository currencyRepository;public MdCurrency findByName(String name) {return currencyRepository.findByName(name);}}
客户端调用:
public class MdCurrencyService {@Autowiredprivate 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
