Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
static int[] MergeArrays(int[] firstArray, int[] secondArray)
{
int n1 = firstArray.Length, n2 = secondArray.Length;
int[] res = new int[n1 + n2];
int p1 = 0, p2 = 0, p = 0;
while (p1 < n1 || p2 < n2)
{
if (p1 < n1 && (p2 == n2 || firstArray[p1] < secondArray[p2]))
res[p++] = firstArray[p1++];
else
res[p++] = secondArray[p2++];
}
return res;
}
static int[] MergeArrays(int[] firstArray, int[] secondArray)
{
int[] res = new int[firstArray.Length + secondArray.Length];
int p1 = 0, p2 = 0, p = 0;
while (p1 < firstArray.Length || p2 < secondArray.Length)
{
if (p1 < firstArray.Length && (p2 == secondArray.Length || firstArray[p1] < secondArray[p2]))
res[p++] = firstArray[p1++];
else
res[p++] = secondArray[p2++];
}
return res;
}
Ну суть в том, что если в коде часто встречается «someArray.Length», то можно заменить его на «n». И читать, и писать код будет удобнее.
В следующем примере, ясно видно, что функция возвращает array():
function sql2array($query, $field=false) {
$Result = array();
Просто для того, чтобы было яснее происходящее c первых строчек кода метода/функции.
а в данном случае у нас код сам себя документирует
function sql2array($query, $field=false) {
$Result = array();
if [...] {
return false;
}
[...]
return $Result;
}
</code>
это тоже путь темной стороны. Даже если язык позволяет, функция не должна возвращать значения разных типов в зависимости от пути выполнения - уж лучше кинуть эксепшн.<?php
$s = false;
echo count($s);
$s = array();
echo count($s);
function sql2array($query, $field=false, &$error=NO_ERROR) {
if (DEBUG)
print ("Query: $query\n");
$queryResource = $this->query($query);
if (!$queryResource){
$error = QUERY_ERROR;
return false;
}
else {
$Result = array();
while($Data = $this->fetch_array($queryResource)) {
if(!$field)
$Result[] = $Data;
elseif (isset($Data[$field]))
$Result[$Data[$field]] = $Data;
else{
$error = FIELD_ERROR;
return false;
}
}
$this->free_result($queryResource);
return $Result;
}
}
Если-бы я поставил $Result после проверки !$queryResource, то глазами пришлось-бы бегло перечитывать код в поисках типа этой переменной.
Поэтому, хороший программист первым делом избавится от излишнего кода, проделав простейший Рефакторинг каждого метода (особенно, когда они занимают 300 строчек), разбив его на более легкие методы и функции с ясными очевидными названиями.
Возврат результата функции через ее параметр
Полностью классы я не привожу. Но уже становится ясным, по каким причинам стоит задуматься о том, каким методом пользоваться для изменения переменной. При всём при том, стоит задуматься о том, как ваш класс может использовать в многопоточных приложениях, или например, при работе с БД.
В функциональном программировании по хорошему счёту — разделяют на «атомарные» функции предварительной инициализации. Например — это реализовано в OpenGL. Но я приведу пример автора:
А теперь о минусах подхода автора. Почему не стоит делать, как он говорит (в языках без поддержки именованных параметров):
void DrawRectangle (RectangleInfo rectInfo)
{
var polyline = new Polyline();
polyline.Points = rectInfo.Rectangle.Corners.Select(pt => pt.ApplyTransformation(rectInfo.Transform));
polyline.Close = true;
polyline.Pen = rectInfo.Pen;
this.DrawPolyLine(polyline);
}polyline.Points = rectInfo.Rectangle.Corners; polyline.Transform = rectInfo.Transform
- void DrawRectangle (float x, float y, float length, float width)
- {
- Rectangle rect;
-
- rect.x1 = x - length/2;
- rect.y1 = y - height/2;
- rect.x2 = x + length/2;
- rect.y2 = y + height/2;
-
- this.DrawPolyLine(rect.x1, rect.y1);
- this.DrawPolyLine(rect.x2, rect.y1);
- this.DrawPolyLine(rect.x2, rect.y2);
- this.DrawPolyLine(rect.x1, rect.y2);
- this.ClosePolyLine(this.FILL);
- }
- void DrawRectangle (Rectangle rect)
- {
- this.DrawPolyLine(rect.point1);
- this.DrawPolyLine(rect.point2);
- this.DrawPolyLine(rect.point3);
- this.DrawPolyLine(rect.point4);
- this.ClosePolyLine(this.FILL);
- }
-
- //...
- Color cl1, cl2;
- Rectangle rect;
-
- cl1.RGB(255, 1, 1);
- cl1.Alpha(20);
- drawer.ForegoundColor(cl1);
-
- cl2.RGBA(1, 1, 255, 255);
- drawer.FillColor(cl2);
-
- rect.CoordinatesWH(x, y, width, height);
- rect.Rotate(angle);
- rect.Zoom(zoom);
-
- drawer.DrawRectangle(rect);
Объявление всех переменных в начале программы
function sql2array($query, $field=false, &$error=NO_ERROR) {
$Result = array();
$queryResource = $this->query($query);
if (!$queryResource){
$error = QUERY_ERROR;
return false;
}
function sql2array($query, $field=false, &$error=NO_ERROR) {
$Result = array();
$queryResource = $this->query($query);
if (!$queryResource) throw new Query_Error_Exception("Error description", Error_Code);
Палка о двух концах или ещё раз о хрупкости кода