构建客户端 REST 库的最惯用方式?
most idiomatic way to structure a client side REST library?
我正在编写 REST API。我想将我的 classes 分成整洁的小文件夹,但我仍然希望它们都可以相互访问包。
这样做的原因是我想要一个 class 只具有 public 访问权限。
示例:
+---com.mysuper.sdk
|
+------ models
| |---- Model.java
+------ controllers
| |---- Controller.java
|
+---PublicAPI.java
- PublicAPI.java 需要能够看到所有模型和控制器。
- 控制器需要能够看到模型。
- 任何使用我的图书馆的人应该只能看到 PublicAPI.java
最惯用的方法是什么?
最惯用的方式来表达你的代码,意思是 Java 约定,是为你的代码提供三个包:com.mysuper.sdk
、com.mysuper.sdk.models
和 com.mysuper.sdk.controllers
.
也就是说,Java 语言规范(2015 年 9 月)中没有任何地方要求包名称反映底层文件夹结构。举个例子:
./src/com/mysuper/sdk/PublicAPI.java
package com.mysuper.sdk;
// Public class.
public class PublicAPI {
// Main method.
public static void main(String... args) {
int[] numbers = new int[args.length];
for (int i = 0; i < args.length; i++) {
numbers[i] = Integer.parseInt(args[i]);
}
System.out.println(new Controller().translateNumbers(numbers));
}
}
./src/com/mysuper/sdk/controllers/Controller.java
package com.mysuper.sdk;
// Package protected class.
class Controller {
// Private model.
private Model model = new Model();
// Package protected method.
String translateNumbers(int... numbers) {
String translation = "";
for (int number : numbers) {
translation = translation + model.get(number) + " ";
}
return translation;
}
}
./src/com/mysuper/sdk/models/Model.java
package com.mysuper.sdk;
// Package protected class.
class Model {
// Private database.
private String[] database = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
// Package protected method.
String get(int number) {
if (number < 0 || number > 9) {
throw new NumberFormatException("Number " + number + " is not between 0 and 9.");
} else {
return database[number];
}
}
}
用 javac
编译这段代码不会抛出任何语法错误,因为代码在语法上是正确的。亲自尝试一下:
javac -d bin ./src/com/mysuper/sdk/PublicAPI.java \
./src/com/mysuper/sdk/controllers/Controller.java \
./src/com/mysuper/sdk/models/Model.java
java -cp ./bin com.mysuper.sdk.PublicAPI 0 1 2 3 4 5 6 7 8 9
您应该得到如下输出:
zero one two three four five six seven eight nine
综上所述,有几个原因表明您应该坚持将 类 组织到单独的包中。
- 大多数 IDE 会将与您的文件夹结构不相关的包视为致命编译错误。
- 这是惯例,因为它有助于提高代码的可读性,引导其他开发人员访问包含您的 类.
的文件夹
- 这将鼓励您更好地封装代码以分离代码模块的职责。
如果您想在遵循 Java 最佳实践的同时获得类似的结果,我鼓励您遵循 Michael Aaron Safyan 的建议并熟悉 Factory Method pattern 以抽象化您的 SDK 的实现从您的 public 界面。
如何最好地为您的项目实施所述模式最好留给另一个问题。
我正在编写 REST API。我想将我的 classes 分成整洁的小文件夹,但我仍然希望它们都可以相互访问包。
这样做的原因是我想要一个 class 只具有 public 访问权限。
示例:
+---com.mysuper.sdk
|
+------ models
| |---- Model.java
+------ controllers
| |---- Controller.java
|
+---PublicAPI.java
- PublicAPI.java 需要能够看到所有模型和控制器。
- 控制器需要能够看到模型。
- 任何使用我的图书馆的人应该只能看到 PublicAPI.java
最惯用的方法是什么?
最惯用的方式来表达你的代码,意思是 Java 约定,是为你的代码提供三个包:com.mysuper.sdk
、com.mysuper.sdk.models
和 com.mysuper.sdk.controllers
.
也就是说,Java 语言规范(2015 年 9 月)中没有任何地方要求包名称反映底层文件夹结构。举个例子:
./src/com/mysuper/sdk/PublicAPI.java
package com.mysuper.sdk;
// Public class.
public class PublicAPI {
// Main method.
public static void main(String... args) {
int[] numbers = new int[args.length];
for (int i = 0; i < args.length; i++) {
numbers[i] = Integer.parseInt(args[i]);
}
System.out.println(new Controller().translateNumbers(numbers));
}
}
./src/com/mysuper/sdk/controllers/Controller.java
package com.mysuper.sdk;
// Package protected class.
class Controller {
// Private model.
private Model model = new Model();
// Package protected method.
String translateNumbers(int... numbers) {
String translation = "";
for (int number : numbers) {
translation = translation + model.get(number) + " ";
}
return translation;
}
}
./src/com/mysuper/sdk/models/Model.java
package com.mysuper.sdk;
// Package protected class.
class Model {
// Private database.
private String[] database = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
// Package protected method.
String get(int number) {
if (number < 0 || number > 9) {
throw new NumberFormatException("Number " + number + " is not between 0 and 9.");
} else {
return database[number];
}
}
}
用 javac
编译这段代码不会抛出任何语法错误,因为代码在语法上是正确的。亲自尝试一下:
javac -d bin ./src/com/mysuper/sdk/PublicAPI.java \
./src/com/mysuper/sdk/controllers/Controller.java \
./src/com/mysuper/sdk/models/Model.java
java -cp ./bin com.mysuper.sdk.PublicAPI 0 1 2 3 4 5 6 7 8 9
您应该得到如下输出:
zero one two three four five six seven eight nine
综上所述,有几个原因表明您应该坚持将 类 组织到单独的包中。
- 大多数 IDE 会将与您的文件夹结构不相关的包视为致命编译错误。
- 这是惯例,因为它有助于提高代码的可读性,引导其他开发人员访问包含您的 类. 的文件夹
- 这将鼓励您更好地封装代码以分离代码模块的职责。
如果您想在遵循 Java 最佳实践的同时获得类似的结果,我鼓励您遵循 Michael Aaron Safyan 的建议并熟悉 Factory Method pattern 以抽象化您的 SDK 的实现从您的 public 界面。
如何最好地为您的项目实施所述模式最好留给另一个问题。