Giter Club home page Giter Club logo

lntu-api's People

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

lntu-api's Issues

我可求求你了

如果每次都要写差不多是一样的请求的话, 不要直接用 Okio.

https://square.github.io/retrofit/

使用 retrofit 来简化书写.

例如

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

还有你这个代码上传前先去除乱七八糟的空行再格式化.

一个正常的源码是这样的

package x
(package 后空一行)
import x
(import 后空一行)
class x {

}
(末尾空行)

kotlin 的 null 控制目的在于标记某些可能是 null 的变量(非常少)(java代码可以通过 @nullable 注解来指定, 也可以在 kotlin 中被识别), 而不是用做延迟初始化的补偿.

例如在 https://github.com/Biubang/lntuPro/blob/master/src/main/kotlin/me/lntu/lntuPro/Login.kt 中, 由于抛出异常后只是简单的打印了错误消息, 因此 init 语法块结束后, 变量可能为 null, 必须使用 Nullable Variable.

实际上在这种情况下, 整个程序是无法继续下去的, 简单地说, 程序初始化已经失败了.

所以此时应该将异常抛到顶层, 如果顶层不处理则直接退出程序.

携带消息的异常如下所示

IllegalStatusException("学号或密码错误")

那么一旦程序可以正常完成初始化, 所有变量都不是 null, 此时变量后面不加问号.

如果变量在 init 语法块中一定能完成初始化(或者如果不能则抛出异常)那么变量可以用 val 声明.

cookie 不需要手动管理, okio 提供 CookieJar 接口, 可以自己实现最简单的 CookieJar 然后让他自动管理 cookie. 详见 okhttp3.CookieJar(就跟浏览器上的 Cookies 管理一样).

package 名是作者或者作者所在的组织/公司的名字, 而不是所调用的api所属的组织/公司.

例如这个项目的包名应该为

com.liaoguoyin.lntupro

包名中如果出现一格有两个单词, 那么有三种情况

  1. 还可以继续拆分, 例如 com.mysqldriver 实际上可以为 com.mysql.driver, 每一格都是有语义的

  2. 可以写为小驼峰, 例如 com.x.myProject(参见微软的 MSSQL JDBC 驱动源码)

  3. 可以写为全小写, 例如 com.x.myproject(这种比较长的也可以小驼峰)(全小写是 Google 的规范) 如果是有缩写的或者比较短的, 一般都是全小写, 例如 lntopro, 这个当一个词处理.

gradle 最新已经是 5.2.1 版本了.

如果项目只有 rootProject, 即没有使用 subProject 功能, 不需要在 setting.gradle 写 include. include 只用来指明 subProject(gradle 默认所有项目都有 rootProject, 并且 rootProject 有代码).

搜索第三方库时, 从 https://mvnrepository.com 搜索, 例如 https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp

okhttp 都 3.13.1 版本了.

当复制的时候, 例如

https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp/3.13.1

点击下面的区域, 点一下就复制好了, 不需要去掉上面的引用路径, 这样比较好看, 例如

dependencies {
    // https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
    compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.13.1'
}

.gradle 文件夹不要传到 git, 那是 gradle 的临时目录

. 开头的文件夹, 在 Unix 为隐藏文件夹(现如今的 MacOS, Linux 都遵循这一原则), 既然它都隐藏了, 那肯定就是不给你看的, 所以这种东西肯定不能传到 git. 记住这一隐藏文件的策略, 以后你会遇到更多 . 开头的东西(或者加入我们 Linux 正教).

单元测试需要一个包名, 大多数单元测试框架都不能在无包名的情况下运作.

通常单元测试为了同时测试访问修饰问题, 不会起一个跟程序本体一样的包名, 取名策略如下

程序本体在 com.liaoguoyin.x

单元测试在 com.liaoguoyin.x.test

(事实上 java 的 default 修饰非常蠢, 因为别人也可以用跟你一样的包名来绕过这种访问修饰, 因此 kotlin 取消了与 default 相同作用域的访问修饰)

okio 返回的是一个 ResponseBody, 但是实际上这个流是不需要关闭的, 也就是不需要使用 .use { }

在调试时观察他的实际返回类型, 然后 jump to type source, 找到他的 .close() 会发现是空的.

也就是说, 通常的代码是这样的

client.newCall(request).execute().body()!!.string()

对于常量, 例如 https://github.com/Biubang/lntuPro/blob/3793a6090410f4a1b75e470538f65d095591484b/src/main/kotlin/me/lntu/lntuPro/Getscore.kt#L12 要放到伴生对象或者全局变量来使其静态化, 不然每次运行到这里都会产生新的字符串对象.

在 OOP 设计上, 类用于抽象化某种现实存在的实体, 或者概念上的逻辑实体, 如果类名是动词那一定设计错了, 比如这个 Login. 实际上 Login 应该是一个工具类, 不应该存在 new 操作.

在此类网站登陆, 访问 API 的逻辑中, 实体为 Client, 例如 LntuClient(表示正在访问辽工大网站的一个客户端). LntuClient 具有 login 等方法. 而不是 new 一个 Login 然后做文章, 这是不符合 OOP **的, 会将程序的逻辑越搞越乱.

槽点太多, 先吐到这里.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.