AI编码技巧让AI先写文档

比如要实现一个功能,首先你提出思路, 让ai按照你的思路写详细代码实现,并标记改动的代码,让你审核,等你审核通过后,再让ai按照文档实现。

ai写文档的时候,要经过你仔细检查,核实,确认无误后,再做代码是实施。这样再能达到更高的正确率。

对于自己思路非常清晰的,可以直接告诉AI你的思路, 让ai 按照你的思路写文档。 对于思路不是很清晰,自己也不知道怎么解决的, 可以宽泛的ai提供你的疑问,让ai给你几个解决方案,你再从中选择。对于自己已经有思路,但是不知道有没有更好的解决方法的时候,你也可以直接问ai,让ai 给你提供其他方法,并且对比你的方法和ai的方法。让ai提供理由,到底选择哪种方案。

当然这些都是基本思路,真正使用起来还可以更加灵活。程序员以后就变成思路输出器,ai沟通大使,看你能不能与ai处成哥们了。

springboot2+jpa+oracle实例

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.example</groupId>
    <artifactId>springboot-jpa-oracle-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
 
    <name>springboot-jpa-oracle-demo</name>
    <description>Demo project for Spring Boot</description>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
           <groupId>com.oracle</groupId>
         
           <artifactId>ojdbc6</artifactId>
         
           <version>11.2.0.4</version>
         
          </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
 
</project>

  application.properties

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCL
 
spring.datasource.username=test
 
spring.datasource.password=test
 
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
 
spring.jpa.properties.hibernate.hbm2ddl.auto=update
 
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
 
spring.jpa.show-sql= true
 
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
 
server.port = 9000

  domain:

package com.example.demo.domain;
 
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator;
 
@javax.persistence.Table(name = "t_dynasty")
@javax.persistence.Entity
public class Dynasty {
    /**
     *
     * id
     *
     */
 
    @Id
 
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
 
    @GeneratedValue(generator = "system-uuid")
 
    @Column(name = "id")
 
    private String id;
 
    @Column(name = "name")
 
    private String name;
 
    @Column(name = "startYear")
 
    private String startYear;
 
    @Column(name = "endYear")
 
    private String endYear;
 
    @Column(name = "age")
 
    private Integer age;
 
    public String getId() {
 
        return id;
 
    }
 
    public void setId(String id) {
 
        this.id = id;
 
    }
 
    public String getName() {
 
        return name;
 
    }
 
    public void setName(String name) {
 
        this.name = name;
 
    }
 
    public String getStartYear() {
 
        return startYear;
 
    }
 
    public void setStartYear(String startYear) {
 
        this.startYear = startYear;
 
    }
 
    public String getEndYear() {
 
        return endYear;
 
    }
 
    public void setEndYear(String endYear) {
 
        this.endYear = endYear;
 
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
 
}

  repository:

package com.example.demo.repository;
 
import org.springframework.data.jpa.repository.JpaRepository;
 
import com.example.demo.domain.Dynasty;
 
public interface DynastyRepository extends JpaRepository<Dynasty, Long> {
}

  controller:

package com.example.demo.web;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.example.demo.domain.Dynasty;
import com.example.demo.repository.DynastyRepository;
 
@RestController
@RequestMapping("/dynasty")
public class DynastyController {
 
    @Autowired
    private DynastyRepository dynastyRepository;
 
    @RequestMapping("/findAll")
    public List<Dynasty> findAll() {
        List<Dynasty> dynastys = dynastyRepository.findAll();
        return dynastys;
    }
 
    @RequestMapping("/hello")
    public String hello() {
        return "success";
    }
}

  启动程序

package com.example.demo;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class Demo1Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }
}

myeclipse添加subclipse插件支持subversion1.9

为了安装subclipse插件,费了很多周折,本来我以为直接用eclipse marketplace搜索安装就行,可是由于网络原因,安装不了。

然后下载安装包吧。目前从国内网站上下载不了支持subversion1.9的subclipse,所以只能从官网上下载。subversion和subclipse的版本要注意下,不然安装后不能使用

subclipse1.12版本下载:

链接:https://pan.baidu.com/s/1sGihUrS7hB5EO-U3VjiaWA
提取码:arvp

把文件解压放到myeclipse的dropins目录下,目录结构如下:

 然后重启myeclipse,就会提示安装好插件,点ok按钮即可。

spring boot 打包为war包方法

刚刚接触spring boot,其快速开发的特性吸引我去研究一下。于是我写了个demo,用spring boot内置的tomcat运行的很好,但是我需要把它部署到外部的tomcat中,于是从网上查找资料如何使用外部的tomcat,总是出问题。报错信息:Caused by: java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager;

猜测是tomcat版本的问题,再次搜索资料,发现其实用内置的tomcat也是可以的,只要打成war包,再指定tomcat版本就可以了。

pom文件:

    <packaging>war</packaging>
    <properties>
        <tomcat.version>7.0.61</tomcat.version>
    </properties>

if else 还在用吗?

  当我们在使用if else 的时候,你是否闻到代码的坏味道呢?

  除非非常简单的逻辑,当我们在写一大坨if else的时候,就应该审视一下是否这样写合适呢?是否这一坨代码体现某一个业务语义呢?是否体现领域通用语言呢?

  每一个if else 分支,往往是某一个业务实现,我们完全可以定义一个统一接口,然后编写不同的实现,然后在代码中调用不同的实现。有人会说调用不同的实现,不也得使用if else吗?是的,但是可以把判断if else 的地方独立分开,比如使用一个工厂类,根据传过来的参数,来调用不同的实现。这样的好处就是,每次有不同情况需要判断是,你并不需要频繁的的修改你功能实现的方法,而只需要修改你的工厂类的方法就可以了。

  此if else 非彼if else ,此if else 把代码与实现分开了成了独立的实现,如果修改,只需要修改你某一个实现就可以了。 甚至可以增加新的实现。并不需要修改你的主体方法。减少出错的可能性。彼if else则完全耦合在一起,一锅粥。修改起来麻烦,且易出错。

面向接口编程

  在我们实现某个功能的时候,其实是可以先写完功能,再实现接口的。比如我们可以先梳理一下这个功能需要哪些方法,这些方法可以独立写到一个接口里,我们在写功能的时候直接调用接口,完成功能的代码编写,最后再把接口的实现代码补充上。岂不方便?

  而这种方法,往往很多人会忽略,甚至不用接口,直接在代码中把功能实现。这样会导致你的功能与实现代码完全耦合在一起,后期的维护会导致你不断的修改此方法。

  如果接口方法与代码实现分离,你只需要修改你的实现就可以了。并且你的主代码逻辑思路会异常清晰。甚至可以不用修改你的实现,增加另一个实现。执行在调用接口处,调用另一个实现就ok了。岂不妙哉。如果你使用了支持注入的框架,比如spring,直接修改一下此接口的实现类就可以了。

xshell 免费版(学生版)下载地址

https://www.xshell.com/zh/free-for-home-school/

个人与教育用途免费

全部功能。零成本

过去 10 年间,NetSarang 始终为用户免费提供功能强大的 SSH 与 SFTP/FTP 客户端。我们的免费许可证不仅价格为零,更不含广告和间谍软件,我们也绝不会以任何方式利用用户牟利。我们相信,无论背景与环境如何,每个人。无论是想要学习、教学,还是仅仅作为业余爱好。都应能使用功能丰富的 SSH 与 SFTP/FTP 客户端。免费许可证仅授权用于个人与教育用途。

Xshell

业界最强的 SSH 客户端。

Xshell 截图

下载了解更多

Xftp

跨网络的轻松文件传输。

Xftp 截图

下载了解更多

免费使用条款

NetSarang 提供的 Xshell 与 Xftp 免费许可证仅限非商业用途。将免费许可证用于商业目的的任何行为都将违反免费最终用户许可协议(EULA)中规定的条款。如需将 Xshell 或 Xftp 用于商业用途,请购买正式许可证。您的支持将帮助我们持续打造更出色的软件。

下载免费许可证软件即表示您同意接收不定期发送的推广折扣、特别活动信息以及补丁说明与通知邮件。您可随时点击任意邮件底部的“取消订阅”按钮停止接收。

我们绝不会将您的信息出售给第三方。