java中mutator方法的最佳实践

时间:2015-11-04 07:16:38

标签: java refactoring

我编写了一个函数来对自定义对象Collection.sort的ArrayList进行排序。

var data = [["Since Mar 10, 2015",150], ["1 year",-17.1], ["3 year",6.9],["Since Mar 10, 2010",100]];


d3.select("#example")
 .datum(data)
 .call(columnChart()
 .width(320)
 .height(240)
 .x(function(d, i) { return d[0]; })
 .y(function(d, i) { return d[1]; }));

function columnChart() {
 var margin = {top: 30, right: 10, bottom: 50, left: 50},
  width = 20,
  height = 20,
  xRoundBands = 0.6,
  xValue = function(d) { return d[0]; },
  yValue = function(d) { return d[1]; },
  xScale = d3.scale.ordinal(),
  yScale = d3.scale.linear(),
  yAxis = d3.svg.axis().scale(yScale).orient("left"),
  xAxis = d3.svg.axis().scale(xScale);
  var isNegative = false;    

 function chart(selection) {
  selection.each(function(data) {

  // Convert data to standard representation greedily;
  // this is needed for nondeterministic accessors.
  for(var i=0; i< data.length; i++){
     if(data[i][1] < 0){
       isNegative = true;
    }
  }  

  data = data.map(function(d, i) {
    return [xValue.call(data, d, i), yValue.call(data, d, i)];
  });

  // Update the x-scale.
  xScale
      .domain(data.map(function(d) { return d[0];} ))
      .rangeRoundBands([0, width - margin.left - margin.right], xRoundBands);


  // Update the y-scale.
  yScale
      .domain(d3.extent(data.map(function(d) { return d[1];} )))
      .range([height - margin.top - margin.bottom, 0])
      .nice();


  // Select the svg element, if it exists.
  var svg = d3.select(this).selectAll("svg").data([data]);

  // Otherwise, create the skeletal chart.
  var gEnter = svg.enter().append("svg").append("g");
  gEnter.append("g").attr("class", "bars");
  gEnter.append("g").attr("class", "y axis");
  gEnter.append("g").attr("class", "x axis");
  gEnter.append("g").attr("class", "x axis zero");

  // Update the outer dimensions.
  svg .attr("width", width)
      .attr("height", height);

  // Update the inner dimensions.
  var g = svg.select("g")
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

 // Update the bars.
  var bar = svg.select(".bars").selectAll(".bar").data(data);
  bar.enter().append("rect");
  bar.exit().remove();
  bar .attr("class", function(d, i) { return d[1] < 0 ? "bar negative" : "bar positive"; })
      .attr("x", function(d) { return X(d); })
      .attr("y", function(d, i) { return d[1] < 0 ? Y0() : Y(d); })
      .attr("width", xScale.rangeBand())
      .attr("height", function(d, i) { return Math.abs( Y(d) - Y0() ); });

// x axis at the bottom of the chart
if( isNegative === true ){
   var xScaleHeight = height - margin.top - margin.bottom+12;
}else{
    var xScaleHeight = height - margin.top - margin.bottom;
}        
 g.select(".x.axis")
    .attr("transform", "translate(0," + ( xScaleHeight ) + ")")
    .call(xAxis.orient("bottom"))
    .selectAll("text")
    .call(wrap, xScale.rangeBand());

// zero line
 g.select(".x.axis.zero")
    .attr("transform", "translate(0," + Y0() + ")")
    .attr("class", "zero axis")
    .call(xAxis.tickFormat("").tickSize(0));


   // Update the text in bars.
   var bar1 = svg.select(".bars").selectAll("text").data(data);

   bar1 .data(data)
       .enter()
       .append("text")
       .attr("class", "text")
       .text(function(d) { return d[1]+"%"; })
       .attr("x", function(d) { return X(d); })
       .attr("y", function(d, i) { return d[1] < 0 ? Math.abs(Y(d)+10) : Y(d)-2; });

    // Update the y-axis.
     g.select(".y.axis")
        //.call(yAxis)
        .call(yAxis.tickSize(3).ticks(5))
        .selectAll("g")
        .selectAll("text")
        .text(function(d){
            return d+"%";
        });

  // Horizontal grid
  g.insert("g", ".bars")         
    .attr("class", "grid horizontal")

    .call(d3.svg.axis().scale(yScale)
        .orient("left")
        .tickSize(-(height), 0, 0)
        .tickFormat("")
     );
 });

以上代码是否干净? 是否可以编写这样的mutator或者应该使用一个新对象并返回它?

1 个答案:

答案 0 :(得分:0)

这取决于studentDAO.getStudents()方法的合同 - 它是否保证始终返回一个新的结果列表(即只有调用者才会引用的对象)?如果是这样,那么您可以安全地对其进行排序。如果没有,你应该复制一份。

另一个问题是 - 它会一直保证吗?如果你添加一些缓存,这可能会出错的方法之一就是很容易打破这种保证。