第九组【团队作业】第六周作业

`package com.hjt.blog.web;

import com.hjt.blog.NotFoundException;
import com.hjt.blog.service.BlogService;
import com.hjt.blog.service.TagService;
import com.hjt.blog.service.TypeService;
import com.hjt.blog.vo.BlogQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class indexController {

@Autowired
private BlogService blogService;

@Autowired
private TypeService typeService;

@Autowired
private TagService tagService;

@GetMapping("/")
public String index(@PageableDefault(size = 8, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable,
                    Model model) {
    model.addAttribute("page",blogService.listBlog(pageable));//拿到分页数据
    model.addAttribute("types", typeService.listTypeTop(7));
    model.addAttribute("tags", tagService.listTagTop(15));
    model.addAttribute("recommendBlogs", blogService.listRecommendBlogTop(8));
    return "index";
}

@PostMapping("/search")
public String search(@PageableDefault(size = 8, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable,
                     @RequestParam String query, Model model) {
    model.addAttribute("page", blogService.listBlog("%"+query+"%", pageable));
    model.addAttribute("query", query);
    return "search";
}

@GetMapping("/blog/{id}")
public String blog(@PathVariable Long id,Model model) {
    model.addAttribute("blog", blogService.getAndConvert(id));

// model.addAttribute("blog", blogService.getBlog(id));
return "blog";
}

@GetMapping("/footer/newblog")
public String newblogs(Model model) {
    model.addAttribute("newblogs", blogService.listRecommendBlogTop(3));
    return "_fragments :: newblogList";
}

}`

`// 充电桩类
class ChargingStation {
int stationId;
boolean isAvailable;
double price;

ChargingStation(int stationId, boolean isAvailable, double price) {
    this.stationId = stationId;
    this.isAvailable = isAvailable;
    this.price = price;
}

}

// 后台系统类
class BackendSystem {
List stations;

BackendSystem() {
    stations = new ArrayList<>();
}

// 添加充电桩
void addChargingStation(int stationId, boolean isAvailable, double price) {
    ChargingStation newStation = new ChargingStation(stationId, isAvailable, price);
    stations.add(newStation);
}

// 获取所有可用的充电桩
List<ChargingStation> getAvailableStations() {
    List<ChargingStation> availableStations = new ArrayList<>();
    for (ChargingStation station : stations) {
        if (station.isAvailable) {
            availableStations.add(station);
        }
    }
    return availableStations;
}

// 更新充电桩状态
void updateStationAvailability(int stationId, boolean isAvailable) {
    for (ChargingStation station : stations) {
        if (station.stationId == stationId) {
            station.isAvailable = isAvailable;
            break;
        }
    }
}

}

// 示例用法
public class Main {
public static void main(String[] args) {
BackendSystem backendSystem = new BackendSystem();

    // 添加充电桩
    backendSystem.addChargingStation(1, true, 2.5);
    backendSystem.addChargingStation(2, false, 3.0);
    backendSystem.addChargingStation(3, true, 2.0);

    // 获取所有可用充电桩
    List<ChargingStation> availableStations = backendSystem.getAvailableStations();
    System.out.println("可用充电桩:");
    for (ChargingStation station : availableStations) {
        System.out.println("充电桩ID:" + station.stationId + ",价格:" + station.price);
    }

    // 更新充电桩状态
    backendSystem.updateStationAvailability(2, true);

    // 再次获取可用充电桩
    availableStations = backendSystem.getAvailableStations();
    System.out.println("\n可用充电桩:");
    for (ChargingStation station : availableStations) {
        System.out.println("充电桩ID:" + station.stationId + ",价格:" + station.price);
    }
}

}`

一. 代码规范采用的方式:
1.1 命名规范:
(1)类名和方法名:indexController、index、search、blog、newblogs等命名采用驼峰命名法,符合命名规范。
(2)变量名:pageable、model等变量名也采用了符合规范的命名方式。
(3)包名:com.hjt.blog.web,采用了反向域名命名规范,符合Java包名命名规范。

1.2 代码结构:
(1)使用了Spring MVC的注解对请求进行处理,代码结构清晰明了。
(2)各个方法分别处理不同的请求,符合单一职责原则。
(3)使用了依赖注入(@Autowired)来注入服务类,降低了耦合性。

1.3 异常处理:代码中没有显式的异常处理机制,可能需要考虑添加异常处理,比如针对NotFoundException进行处理并返回友好的错误页面或信息。

二. 本小组项目的“代码复审核查表”:
2.1 图1:
(1)概要部分:
1)代码符合需求和规格说明。代码实现了添加充电桩、获取可用充电桩和更新充电桩状态等功能。这与预期的需求和规格说明相符。
2)代码设计考虑周全。代码采用了面向对象的思想,将充电桩的属性和行为封装在ChargingStation类中,而充电桩的管理逻辑则封装在BackendSystem类中。这种设计使得代码结构清晰,易于理解和维护。同时,通过方法的封装和模块化设计,提高了代码的复用性和可扩展性。
3)代码可读性良好。变量和方法命名具有描述性,有助于理解代码的含义。代码块之间有适当的注释解释其功能,进一步提高了代码的可读性。开发者可以轻松理解代码的意图,并且在需要的时候能够快速定位到相关的部分。
4)代码容易维护。代码结构清晰,逻辑简洁明了,易于定位和修改。每个类的职责单一,代码的耦合度较低,因此对于功能的修改或扩展,可以在不影响其他部分的情况下进行。
5)每一行代码都被执行并检查过。尽管代码中没有显式的测试代码,但是通过Main类中的代码,可以确保每个方法都至少被调用过一次,从而保证了代码的覆盖率。

(2)设计规范部分:
1)设计遵从已知的设计模式或项目中常用的模式。虽然没有显式地使用设计模式,但是代码结构符合面向对象的设计原则,将功能进行了合理的封装和分层,从而使得代码易于理解和维护。
2)没有硬编码或字符串/数字等存在。代码中使用变量来表示充电桩的属性,而不是直接使用硬编码的数字或字符串。这样做使得代码更具可维护性和可读性。
3)代码不依赖于特定平台,易于移植。BackendSystem类中的代码与特定平台无关,因此可以轻松地移植到其他平台上,而不需要进行大量的修改。
4)新写的代码可以利用已有的功能实现,避免了重复实现类似功能的代码。例如,添加充电桩和获取可用充电桩的功能可以通过调用ArrayList类的方法来实现,而不需要重新实现这些功能,从而提高了代码的复用性和可维护性。
5)没有无用的代码。代码简洁明了,没有多余或无用的代码需要清除。这有助于保持代码的整洁性和可读性。

2.2 图2:
(1)错误处理:
代码中未对可能出现的错误情况进行充分处理。在调用外部函数时,未检查返回值或处理异常。
参数传递方面,代码未对字符串长度的计算进行说明,可能存在歧义。需要明确是以字节长度还是字符长度计算,并且是否从0开始计数或从1开始计数。
(2)无参数传递错误,字符串的长度是以字符长度计算的。是以0开始计算的。
(3)边界条件处理:
代码未明确说明对边界条件的处理方式。例如在 switch 语句中的 default 分支,没有说明默认情况下的处理逻辑。
循环可能存在死循环的风险,需要仔细审查循环条件,确保循环能够正常退出。
(4)断言(Assert)的使用:
代码未使用断言来确保认为不变的条件得到满足,这可能使得代码在某些条件下出现异常行为。
(5)资源利用和泄漏:
代码中未明确说明资源的申请和释放情况,需要查看代码以确定资源是否在正确的地方被申请和释放,并且是否存在资源泄漏的风险。
(6)数据结构优化:
代码中可能存在未使用的数据结构元素,需要进行审查并删除不必要的元素以提高代码的效率和可维护性。

2.3 图3:
(1)效能
1)代码的效能(Performance):
这段代码的效能取决于 blogService、typeService 和 tagService 的实现,以及在这些服务方法内部的具体操作。代码本身没有明显的性能瓶颈,但具体的性能取决于服务层的实现和数据量。最坏情况可能是这些服务方法在处理大量数据时性能下降。
2)循环中的优化:
这段代码没有明显的循环,因此没有需要优化的循环部分。关于字符串操作,目前的代码没有直接的字符串拼接操作,所以不需要考虑使用 StringBuilder 进行优化。
3)对于系统和网络的调用是否会超时?如何处理?:
在当前代码中,涉及到的服务调用(blogService、typeService 和 tagService)可能会依赖于外部资源(如数据库),如果外部资源响应较慢或出现故障,可能导致调用超时。对于这种情况,可以通过设置适当的超时时间,并使用合适的异常处理机制来处理超时情况,例如捕获超时异常并进行重试,或者返回友好的错误提示给用户。

(2)可读性:
代码的可读性较好,采用了合理的命名规范和注释,易于理解。但是,可以进一步提高可读性,例如通过添加更多的注释来解释代码的逻辑和功能,以便其他开发人员更容易理解和维护代码。

(3)可测试性:
代码的可测试性较好,因为它采用了依赖注入的方式,可以轻松地对服务进行模拟和替换。如果还没有单元测试,可以考虑编写针对这些控制器方法的单元测试,以确保它们的正确性和稳定性。针对特定领域的开发,可以制定相应的测试计划和测试用例,例如针对服务层的集成测试或端到端的功能测试。

三. 代码复审查回顾本小组项目代码:
a. 确认代码是否容易理解?
代码结构清晰,命名具有描述性,容易理解。
b. 是否符合代码规范?
大部分符合代码规范,但缺乏适当的注释和错误处理。
c. 代码是否正确?
代码在功能上是正确的,但可能存在一些潜在的错误情况未处理。
d. 对于各种边界情况能否正确处理?
代码对一些边界情况未做处理,例如更新充电桩状态时给定的充电桩ID不存在的情况。需要进一步完善错误处理机制。

posted @   今天少吃一顿  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示