首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无人驾驶飞机交付调度服务

无人驾驶飞机交付调度服务
EN

Code Review用户
提问于 2019-06-06 00:59:25
回答 1查看 386关注 0票数 9

我最近接受了WalmartLabs的采访。我的任务是带回家。我没有签署NDA,WalmartLabs的一个团队说我可以在GitHub上发布代码。我的任务是开发一个程序,以这样的方式交付订单,以最大限度地提高客户满意度。我解决这个问题的方法是使用优先级队列。优先级队列将根据创建的顺序、日期和与目标的距离来确定优先级。诚然,我犯了一个错误,就是在排序时没有考虑到总通过时间。我想成为一个更好的开发人员。我想知道是否有人可以看看我在https://github.com/vaughnshaun/Walmart_DroneChallenge的github项目,告诉我我的设计有什么缺陷和/或优点。下面是我的程序的一个主要类的片段。整个项目都在我的github。该项目的规范是在一个名为DroneDeliveryChallengeSpec.pdf的pdf中。

代码语言:javascript
运行
复制
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;
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-06-06 05:08:55

在你的设计中有一些基本的考虑。

守护参数

至少对API的公共入口点上的参数执行NotNull检查。

公共OrderDeliverer(仓库仓库,IOrderStreamer orderStreamer) { this.warehouse =仓库;this.orderStreamer = orderStreamer;}

代码语言:javascript
运行
复制
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;
    }

如果可以的话,

避免嵌套语句代码读起来更容易,嵌套语句的数量保持在最低限度。 如果(!warehouse.HasOrders) { orderStreamer.AdvanceTime();} //继续处理订单,而存在订单if (warehouse.HasOrders) { //在HasOrders时编码。} if (!warehouse.HasOrders) { orderStreamer.AdvanceTime(); return; } // Keep processing orders while there are orders // code when HasOrders ..

避免冗余注释

只有当注释向代码中添加了大量新信息时,才应该添加注释。在上面的片段中,您可以不使用

// Keep processing orders while there are orders

内联变量声明

这可以用更简洁的方式写出来。

订单;否则,如果(warehouse.TrySendNextOrder(out order))

代码语言:javascript
运行
复制
else if (warehouse.TrySendNextOrder(out Order order))

冗余变量类型

当可以从实例化类型从逻辑上派生时,不需要打印声明的类型。

DeliveredOrder outboundOrder = new DeliveredOrder(order.Id);

代码语言:javascript
运行
复制
  var outboundOrder = new DeliveredOrder(order.Id);

事件生命周期管理

您有办法取消订阅事件吗?This是许多内存泄漏的原因。

travelMinutes += warehouse.GetOrderReturnMinutes(order);

性质与

方法

怎么决定?考虑为简单的getter GetNumberOfCompleted使用属性。

虚拟方法

如果有虚拟方法的用例,则声明它。您声明您的方法为虚拟的原因是什么?

public virtual void ProcessOrder(

票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/221757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档