Лес кривых рук

в 21:35, , рубрики: Программирование, юмор, метки:

Тут недавно был топик за PHP и против.

Этот code monkey познал дао ООП. А ты, Люк?
Этот code monkey познал дао ООП. А ты, Люк?

А я к PHP безразличен. Как и к С++, Java, Питон/Руби и так далее.

Нет, есть, конечно, вкусовые предпочтения. Но в объективном отношении, все эти языки — инструменты. И на всех можно писать как хорошо, так и криво. И у каждого языка есть свои недостатки.

Я утверждаю, что кривые руки есть на любом языке, и поэтому нельзя говорить, скажем, что Питон или Руби — это круто, а вот на PHP однозначно только быдлокодеры и потому язык — с плохим дизайном.

Посмотрим, как дизайн влияет на качество кода языков.

Вы не согласны? Прошу под кат.

Начнем с С++. Этот язык считается ТруЪ и ходят утверждения, что настолько велик порог входа, что говнокода не может быть в принципе.

Велкам:
int p,k,l,i,j,d,q,R,t,r;
S1: s=0; p=1;
S2: if (s==0) { i=1; j=n; k=n; l=2*n+1; }
if (s==1) { i=n+1; j=2*n; k=0; l=n+1; }
d=1; q=p; r=p;
S3: if (x[i]>K>x[j]->K) goto S8;
S4: k=k+d; x[k]=x[i]; c[k]=c[i];
S5: i+=1; q-=1; if (q>0) goto S3;
S6: k+=d; if (k==l) goto S13; else x[k]=x[j];c[k]=c[j];
S7: j-=1; r-=1; if (r>0) goto S6; else goto S12;
S8: k+=d; x[k]=x[j]; c[k]=c[j];
S9: j-=1; r-=1; if (r>0) goto S3;
S10: k+=d; if (k==l) goto S13; else x[k]=x[i];c[k]=c[i];
S11: i+=1; q-=1; if (q>0) goto S10;
S12: q=p; r=p; d=-d; t=k; k=l; l=t; if (j-i<p) goto S10; else goto S3;
S13: p+=p; if (p<n) { s=1-s; goto S2; }
if (s==0) for (t=1; t<=n; t+=1) { x[t]=x[t+n];c[t]=c[t+n] }

Мастер сортировать явно что-то покурил.

Итак, идем дальше. Java, как известно, это тру ООП. Стоят такие программисты в два раза дороже, и значит, code smells нельзя написать ни про одну строчку данного кода.
Данный пример опровергает теоретиков такого подхода:

boolean is_admin;
// something
Boolean b = new Boolean( is_admin );
if( b.toString().length() == 4 ) {
// something...
}
// something

Ну и еще пара шедевров от всем знакомых технологий, на которых не существует говнокода

case Target.Review:
{
if (reviewing)
{
var solutionIdsInTargetsPool = context.SolutionsPools.Where(sp => sp.TaskTargetId ==
taskTargetId && sp.Idea.ParentId == taskId).Select(sp => sp.SolutionId).ToList();

var permission = false;
///TODO: Адовъ говнокод!!! Надо поправить! Сделать метод, который для пачки айдишников отдаст права по пермишену
foreach (int sid in solutionIdsInTargetsPool)
{
permission = PermissionLogic.ExecuteCheckPermissionQuery(context, userName, PermissionCode.Reviewing,
projectId, sid, userName);
if (permission)
break;
}

if (!permission)
break;
var subQuery = from ptn in context.ProjectTreeNodes.OfType()
where ptn.Id == taskId
select new AvailableTargetInfo
{
TaskTargetId = taskTargetId,
NodeID = ptn.Id,
Name = ptn.ShortName,
ShortDescription = ptn.ShortDescription,
TaskTargetType = targetType,
StartDateTime = startDateTime,
EndDateTime = endDateTime,
UnvotedCount = 0,
PoolLength = 0,
SolutionsCreated = false,
TransactionsExists = false,
Progress = 0,
TaskTypeIconId = (int)ptn.TaskType.Icon,
IsDraft = false,
TaskTypeIcon = Icon,
Description = description
};
if (query != null)
query = query.Union(subQuery);
else
query = subQuery;
}
} break;

//***********************************************

./DataBase/DataBaseResources/2CreateTables/CreateTables.sql
-- Пашина (khilko) мудацкая таблица
-- Table Structure
CREATE TABLE [dbo].[AccomplishedTargets] (
[UserId] [int] NOT NULL,
[TaskTargetId] [int] NOT NULL
)
GO

//***********************************************

public OperationResult SendMessageToUsers(string receiveUsers,
string body, string subject,
UserInfo sender,
int projectId,
MessageType messageType)
{
// TODO ГОВНОКОД!!!!
//string subject = string.Empty;

//if (body.Length > 50)
// subject = string.Format("{0}...", body.Substring(0, 47));
//else
// subject = body;

List usersName = receiveUsers.Trim().Split(";");

UserInfo senderInfo = sender;

int templateId = CreateMessageTemplate(messageType
, projectId
, senderInfo.Id
, body, subject);

List messagesId =CreateMessage(templateId, usersName.ToArray());

OperationResult result = new OperationResult();

foreach (Guid messageId in messagesId)
{
result = SendMessage(templateId);

if (result.IsSuccess)
{
result = SetFromStatus(messageId, MessageStatus.Read);
}
}

return result;
}

Собственно, а выводы неутешительны. Как бы не хотели академики, PHP не умрет давайте жить дружно! И те, кто шарит, заставляйте людей читать правильные книжки и учиться по вашим кодревью-замечанием. Потому что если люди не знают матан, теорию графов, KISS, SOLID, IoC, Кнута и другие страшные слова, им не поможет знание операторов C++ самого нормального языка. И если не мы — то никто не научит.

Ведь программируют люди, и если мы не будем учить новичков и вправлять им мозги, к примеру, как вправляет Роберт С. Мартин в «Быстрой разработке ПО» («Rapid software development» — примеры в книге, правда, исключительно случайно только на с++ и яве).

Всем чистого кода, стройной архитектуры и поменьше говнокода на поддержке (для чего его нужно не забывать рефакторить)!

Автор: Cord

Поделиться

* - обязательные к заполнению поля