Code Reveiw工具 Jupiter 使用详解

首先把jupiter安装到eclipse中……

直接把下载好的jupiter.jar放到eclipse的plugins文件夹里面即可,重启下

 Jupiter里,代码评审(code review)分为4个流程

  1. Configuration(配置):review发起者设置“Review ID”,指定要评审的代码,参与代码评审的人员,要讨论的问题等等。
  2. Individual review(个人评审):每个人独自审查代码,把可能出现问题的代码加入checklist
  3. Team review(团队评审):大家在一起讨论之前检查出的问题代码,并决定如何处理
  4. Rework:开发人员根据之前评审的结果,对代码进行修复

下面对4个步骤进行简介:

1.Configuration

由评审发起者(代码作者、team leader或者PM)进行配置。

打开项目属性->Review选项页。点击“New...”,设置相应的ReviewId和description

2007-06-06_152003

接着添加本次要评审的代码和文件

2007-06-06_152841

添加参与代码评审的人员

2007-06-06_153048

接下来设置各种缺陷类型、严重性之类的。然后就是指定存放评审数据的目录。这个目录是相对于项目根目录的。如下图的设置,数据就会存放在“项目根目录/review”里

2007-06-06_153648

设置完成后,Jupiter将在项目根目录下生成“.jupiter”文件,把此文件存入CVS。现在评审发起者可以通知大家进行代码评审了。可以通过发邮件的方式进行通知,通知的内容最好有以下部分:

  • 项目名称、Review ID、参与评审人员名单。
  • 被评审代码的描述信息,如功能,需求等等
  • 新增加和删除的文件
  • 受影响但没有在Configuration中指定的组件

通知完毕后,各成员即可正式进行代码评审。

2.Individual review

从CVS取出最新的代码和.jupiter文件,在eclipse里->窗口(Window)->打开透视图(Open Perspective)->Review。然后选择Individual Phase

2007-06-06_161640

选择项目名称,Review ID和Reviewer ID(评审者ID),然后就可以开始查看代码了。

在代码评审过程中,发现有问题的代码,即可在上面点击右键菜单->Add Review Issue...把问题添加到Jupiter中,指定问题类型、严重性和描述信息,点击保存。

2007-06-06_162654

2007-06-06_162900

完成个人的代码评审后,把Jupiter评审数据目录下的文件传入CVS,就可以一起进行讨论了。

3.Team review

大家在一起,使用一台电脑或者投影仪,选择Team Phase

2007-06-06_163518

现在Individual Phase里检查出的所有的问题都会显示在ReviewTable里,点击Go To就能链接到问题所在代码,然后大家讨论这段代码是否有问题,如何解决等等,把结果写到ReviewEditor里,保存。

2007-06-06_164057

所有的问题讨论出结果后,把Jupiter评审数据文件传入CVS,散会,各自回到自己位置,进行下一个步骤

4.Rework

从CVS取出最新的Jupiter评审数据文件,选择Rework Phase

2007-06-06_164516

选择自己的ID后,上一步骤中分配给自己的问题就会显示到ReviewTable里,一个一个地把问题修复吧,修复后把状态置为Resolved。完毕后把Jupiter数据传CVS。

各自的rework完成后,各位评审者取出最新的Jupiter数据,关闭ReviewTable的过滤器,就能查看到本次评审中发现的各种问题,对各种问题进行验证,感到满意后可以把状态置为Closed,或者验证未通过,就置为Re-Opened。

如此,便完成了一次代码评审……

参考资料:

以下是基于PyTorch建立卷积神经网络进行文本二分类的详细代码: ``` import torch import torch.nn as nn import torch.optim as optim from torchtext.data import Field, TabularDataset, BucketIterator # 设置随机种子 SEED = 1234 torch.manual_seed(SEED) torch.backends.cudnn.deterministic = True # 定义Field TEXT = Field(tokenize='spacy', batch_first=True, include_lengths=True) LABEL = Field(sequential=False, is_target=True) # 构建TabularDataset fields = {'label': ('label', LABEL), 'review': ('text', TEXT)} train_data, test_data = TabularDataset.splits( path='.', train='train.csv', test='test.csv', format='csv', fields=fields) # 构建词汇表 TEXT.build_vocab(train_data, max_size=25000, vectors='glove.6B.100d') LABEL.build_vocab(train_data) # 定义模型 class CNN(nn.Module): def __init__(self, vocab_size, embedding_dim, n_filters, filter_sizes, output_dim, dropout): super().__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.convs = nn.ModuleList([nn.Conv2d(in_channels=1, out_channels=n_filters, kernel_size=(fs, embedding_dim)) for fs in filter_sizes]) self.fc = nn.Linear(len(filter_sizes) * n_filters, output_dim) self.dropout = nn.Dropout(dropout) def forward(self, text, text_lengths): embedded = self.embedding(text) embedded = embedded.unsqueeze(1) conved = [nn.functional.avg_pool2d(nn.functional.relu(conv(embedded)), (text.shape[1], 1)).squeeze(3) for conv in self.convs] cat = self.dropout(torch.cat(conved, dim=1)) return self.fc(cat) # 定义超参数 BATCH_SIZE = 64 EMBEDDING_DIM = 100 N_FILTERS = 100 FILTER_SIZES = [3] OUTPUT_DIM = 1 DROPOUT = 0.5 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 构建迭代器 train_iterator, test_iterator = BucketIterator.splits( (train_data, test_data), batch_size=BATCH_SIZE, device=device, sort_key=lambda x: len(x.text), sort_within_batch=True) # 初始化模型、优化器和损失函数 model = CNN(len(TEXT.vocab), EMBEDDING_DIM, N_FILTERS, FILTER_SIZES, OUTPUT_DIM, DROPOUT).to(device) optimizer = optim.Adam(model.parameters()) criterion = nn.BCEWithLogitsLoss().to(device) # 训练模型 def train(model, iterator, optimizer, criterion): epoch_loss = 0 epoch_acc = 0 model.train() for batch in iterator: optimizer.zero_grad() text, text_lengths = batch.text predictions = model(text, text_lengths).squeeze(1) loss = criterion(predictions, batch.label.float()) acc = ((predictions > 0.5) == batch.label.byte()).sum().item() / len(batch.label) loss.backward() optimizer.step() epoch_loss += loss.item() epoch_acc += acc return epoch_loss / len(iterator), epoch_acc / len(iterator) # 测试模型 def evaluate(model, iterator, criterion): epoch_loss = 0 epoch_acc = 0 model.eval() with torch.no_grad(): for batch in iterator: text, text_lengths = batch.text predictions = model(text, text_lengths).squeeze(1) loss = criterion(predictions, batch.label.float()) acc = ((predictions > 0.5) == batch.label.byte()).sum().item() / len(batch.label) epoch_loss += loss.item() epoch_acc += acc return epoch_loss / len(iterator), epoch_acc / len(iterator) N_EPOCHS = 50 best_valid_loss = float('inf') train_loss_list, train_acc_list, valid_loss_list, valid_acc_list = [], [], [], [] for epoch in range(N_EPOCHS): train_loss, train_acc = train(model, train_iterator, optimizer, criterion) valid_loss, valid_acc = evaluate(model, test_iterator, criterion) train_loss_list.append(train_loss) train_acc_list.append(train_acc) valid_loss_list.append(valid_loss) valid_acc_list.append(valid_acc) if valid_loss < best_valid_loss: best_valid_loss = valid_loss torch.save(model.state_dict(), 'cnn-model.pt') print(f'Epoch: {epoch+1:02}, Train Loss: {train_loss:.3f}, Train Acc: {train_acc*100:.2f}%, Val. Loss: {valid_loss:.3f}, Val. Acc: {valid_acc*100:.2f}%') # 绘制训练集和测试集每一轮的准确率和损失率折线图 import matplotlib.pyplot as plt plt.plot(train_loss_list, label='Training Loss') plt.plot(valid_loss_list, label='Validation Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() plt.show() plt.plot(train_acc_list, label='Training Accuracy') plt.plot(valid_acc_list, label='Validation Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend() plt.show() ``` 在这个代码中,我们首先定义了 `Field`,并使用 `TabularDataset` 加载数据集。然后,我们使用 `Field` 构建了词汇表,并使用 `BucketIterator` 构建了迭代器。接着,我们定义了卷积神经网络模型,并使用 `Adam` 优化器和 `BCEWithLogitsLoss` 损失函数进行训练。我们使用了 `train` 和 `evaluate` 两个函数分别进行训练和测试。最后,我们使用 `matplotlib` 绘制了训练集和测试集每一轮的准确率和损失率折线图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值