我最近接受了WalmartLabs的采访。我的任务是带回家。我没有签署NDA,WalmartLabs的一个团队说我可以在GitHub上发布代码。我的任务是开发一个程序,以这样的方式交付订单,以最大限度地提高客户满意度。我解决这个问题的方法是使用优先级队列。优先级队列将根据创建的顺序、日期和与目标的距离来确定优先级。诚然,我犯了一个错误,就是在排序时没有考虑到总通过时间。我想成为一个更好的开发人员。我想知道是否有人可以看看我在https://github.com/vaughnshaun/Walmart_DroneChallenge的github项目,告诉我我的设计有什么缺陷和/或优点。下面是我的程序的一个主要类的片段。整个项目都在我的github。该项目的规范是在一个名为DroneDeliveryChallengeSpec.pdf的pdf中。
public class OrderDeliverer
{
private List completedOrders = new List();
private IOrderStreamer orderStreamer;
private Warehouse warehouse;
private Double promoters;
private Double detractors;
private Action deliveredOrderAction;
public OrderDeliverer(Warehouse warehouse, IOrderStreamer orderStreamer)
{
this.warehouse = warehouse;
this.orderStreamer = orderStreamer;
}
public virtual void ProcessOrder()
{
// Artificially advance the time to the next order waiting to be created
// This is a fail safe, just in case the the processing of orders don't advance time enough
if (!warehouse.HasOrders)
{
orderStreamer.AdvanceTime();
}
// Keep processing orders while there are orders
if (warehouse.HasOrders)
{
Order order;
// If there isn't time for delivery the order should be moved to next day delivery
if (!warehouse.HasTimeToDeliverNextOrder(orderStreamer.CurrentTime))
{
warehouse.MoveNextOrderToNextDay();
}
else if (warehouse.TrySendNextOrder(out order)) // Try to send the order out of the warehouse
{
// Create a delivered order and track its status and times
DeliveredOrder outboundOrder = new DeliveredOrder(order.Id);
outboundOrder.OrderPlaced = order.Created;
outboundOrder.DepartureTime = orderStreamer.CurrentTime;
outboundOrder.DeliveredTime = outboundOrder.DepartureTime;
// Time traveled to the destination
double travelMinutes = warehouse.GetOrderDeliveryMinutes(order);
outboundOrder.DeliveredTime = outboundOrder.DeliveredTime.AddMinutes(travelMinutes);
// Total time traveled, includes to destination and returning back to the warehouse
travelMinutes += warehouse.GetOrderReturnMinutes(order);
completedOrders.Add(outboundOrder);
deliveredOrderAction(outboundOrder);
switch (outboundOrder.GetRating())
{
case OrderHelper.RatingType.Detractor:
detractors++;
break;
case OrderHelper.RatingType.Promoter:
promoters++;
break;
}
warehouse.DockDrone();
// Update the mock global time (will also bring more new orders depending on the time)
orderStreamer.AddMinutesToTime(travelMinutes);
}
}
}
public void OnDeliveredOrder(Action deliveredAction)
{
deliveredOrderAction += deliveredAction;
}
///
/// The number of orders successfully delivered
///
/// Returns an int for the count of delivered orders
public int GetNumberOfCompleted()
{
return completedOrders.Count;
}
public double GetNps()
{
double nps = 0;
if (completedOrders.Count > 0)
{
double promoterPercent = (promoters / completedOrders.Count) * 100;
double detractorPercent = (detractors / completedOrders.Count) * 100;
int decimalPlaces = 2;
nps = Math.Round(promoterPercent - detractorPercent, decimalPlaces);
}
return nps;
}
}
发布于 2019-06-06 05:08:55
在你的设计中有一些基本的考虑。
至少对API的公共入口点上的参数执行NotNull检查。
公共OrderDeliverer(仓库仓库,IOrderStreamer orderStreamer) { this.warehouse =仓库;this.orderStreamer = orderStreamer;}
public OrderDeliverer(Warehouse warehouse, IOrderStreamer orderStreamer)
{
if (warehouse == null)
throw new ArgumentNullException(nameof(warehouse));
if (orderStreamer== null)
throw new ArgumentNullException(nameof(orderStreamer));
this.warehouse = warehouse;
this.orderStreamer = orderStreamer;
}
如果可以的话,
只有当注释向代码中添加了大量新信息时,才应该添加注释。在上面的片段中,您可以不使用
// Keep processing orders while there are orders
这可以用更简洁的方式写出来。
订单;否则,如果(warehouse.TrySendNextOrder(out order))
else if (warehouse.TrySendNextOrder(out Order order))
当可以从实例化类型从逻辑上派生时,不需要打印声明的类型。
DeliveredOrder outboundOrder = new DeliveredOrder(order.Id);
var outboundOrder = new DeliveredOrder(order.Id);
您有办法取消订阅事件吗?This是许多内存泄漏的原因。
travelMinutes += warehouse.GetOrderReturnMinutes(order);
方法
怎么决定?考虑为简单的getter GetNumberOfCompleted
使用属性。
如果有虚拟方法的用例,则声明它。您声明您的方法为虚拟的原因是什么?
public virtual void ProcessOrder(
https://codereview.stackexchange.com/questions/221757
复制相似问题