Великая Пирамида Древнего Кода / it-юмор

it-юмор 

Великая Пирамида Древнего Кода

public override bool Equals(object obj) { if (!obj is User) return false;
if (((User)obj).FirstName — this.FirstName) { if (((User)obj).LastName — this.LastName) {
if (((User)obj).EmailAddress this.EmailAddress) { if (((User)obj).Password — this.Password) {
if (((User)obj).AvatarURL —
Подробнее
public override bool Equals(object obj) { if (!obj is User) return false; if (((User)obj).FirstName — this.FirstName) { if (((User)obj).LastName — this.LastName) { if (((User)obj).EmailAddress this.EmailAddress) { if (((User)obj).Password — this.Password) { if (((User)obj).AvatarURL — this.AvatarURL) { if (((User)obj).DisplayName =** this.DisplayNarae) { if (((User)obj).Language -- this.Language) { if (((User)obj).PhoneNumber — this.PhoneNumber) { if (((User)obj).LastLoginDate — this.LastLoginDate) { if (((User)obj).RegistrationDate -• this.RegistrationDate) { if (((User)obj).DateOfBirth — this.DateOfBirth) { if (((User)obj).Address — this.Address) { if (((User)obj).SuitNo — this.SuitNo) { if (((User)obj).ZipCode -« this.ZipCode) { if (((User)obj).State «= this.State) { if (((User)obj).Country — this.Country) if (((User)obj).AccountBalance — this.AccountBalance) { if (((User)obj).SecretQuestionCode -• this.SecretQuestionCode) { if (((User)obj).SecretQuestionAnswer — this.SecretQuestionAnswer) { if (((User)obj).LastPurchaseDate — this.LastPurchaseDate) { if (((User)obj).Fetish — this.Fetish) { return true; > } > > } a > > return false;
it-юмор
Еще на тему
Развернуть
Илюха, остановись!
Илюха, не останавливайся!
mazd mazd 19.04.201822:11 ответить ссылка -6.4
Orothar Orothar 19.04.201822:11 ответить ссылка 3.5
Кто первый оптимизирует код - выдам медальку.
Иисyc Иисyc 19.04.201822:15 ответить ссылка 5.2
&&
Я отрефакторил:
На каждое условие поставить отрицание, если оно срабатывает - возвращать false.

В самом днище вернуть true.
один раз в локальную переменную скастить obj в user
вово, только за это руки поломать хочца, столько беспощадных кастовок пиздец
Ещё нужно после проверки типа добавить проверку, не является ли наш obj тем самым this, то есть не сравниваем ли мы объект сам с собой, что однозначно и без всяких доп. проверок должно давать true.

Да и там 95% проверок вообще нафиг не нужны для логики работы приложения, можно даже ID сделать уникальный, который и на уровне БД будет контролироваться и гарантировать идентификацию конкретного Юзера внутри самого приложения. А ещё представим, что мы сравниваем две копии Юзера, одна до внесения изменений в понравившееся мне поле User.Fetish, а другая после - и один и тот же по сути Юзер уже не эквивалентен самому себе.
Мне нравится последняя фича
public override bool Equals(object obj) => obj is User user && user.x == this.x && ...
Работает не ломай. За это никто не заплатит.
Если предположить, что сравниваются свойства, что тип объекта this не пересекается с иерархией типа User, что не все поля User надо сравнивать, то вот такой вариант сойдет... Выглядит всё равно уёбищно, работает дольше, но зато в одну строчку!
public override bool Eguals(object obj)
{
return obj is User && new[]
{
nameof(User.EmailAddress), nameof(User.Password), nameof(User.AvatarURl), nameof(User.PhoneNumber), nameof(User.LastloginDate), nameof(User.ZipCode), nameof(User.State), nameof(User.Country), nameof(User.AccountBalance),
selma selma 20.04.201802:11 ответить ссылка -1.8
А теперь поговорим о том, как у этого дерьма будет с производительностью.
Там сверху написано.
selma selma 20.04.201802:29 ответить ссылка 1.3
Ну если профилировщик не покажет там лагов, то можно и оставить. А не показать он может если объекты не сравнивает никто.
Иисус, ты себе веб-разработчика ищешь что ли?
anamnian anamnian 20.04.201805:56 ответить ссылка -0.5
return (Object)obj == (Object)this;
b.o.g b.o.g 20.04.201808:34 ответить ссылка -0.5
Если у объектов будет одно различное не сравниваемое свойство (например время создания объектов), или свойство хранящее ссылку, то твой способ будет сасат
Исходим из того, что это потомки одного класса и условие метод класса.
В данном, конкретном случае я вижу только фиксированный перечень свойств.
Методы для экземпляров будут содержать одни и те же ссылки.
Следовательно. Все будет работать.
b.o.g b.o.g 20.04.201811:00 ответить ссылка 0.0
А коммент мы читаем жопой.
Этот "фиксированный перечень свойств" может быть иметь свойства, которые не должны сравниваться (в каждом экземпляре они могут быть разные). И если есть свойства, доступные по значению, то ты будешь сравнивать адреса, а не значения. :/
Есть кусок кода. В котором перечислены сравниваемые свойства.
Экземпляры одного класса не могут иметь разных свойств.
Ещё раз повторю, что в данном конкретном куске кода все будет работать через логический оператор. Применительно к (справедливо замеченным ниже поправкам ЯП - Шарп) оператр будет сравнивать объекты приведенные к определенному типу данных.
b.o.g b.o.g 20.04.201814:00 ответить ссылка 0.0
Ок. Принимаю все замечания. С телефона не увидел ЯП.
Итого. Даже с учётом моих косяков.
Приводим к одному типу объекта и сравниваем объекты.
Если надо проверить ряд свойств - делаем какой-нибудь toString по перечню свойств нужных для сравнения - простой конкатенацией. Сравниваем.
И т.д. и т.п.
b.o.g b.o.g 20.04.201814:18 ответить ссылка 0.0
А написать единый метод сравнения этих объектов, который будет быстрее, оптимизированней и проще - совесть не позволяет?
Этот метод по всей видимости и показан в посте. Вопрос в вариантах его упрощения.
Да и то, что написано выше обернуть в метод класса. Это кагбэ тривиально.
b.o.g b.o.g 20.04.201815:44 ответить ссылка -0.6
А вот нихуя, в твоём примере будут сравниваться адреса в памяти и всё
Приведи к массиву.
Можешь сериализовать и сравнить строки. И ещё
Стопицот вариантов
Кто ж запрещает.

адреса в памяти в php
b.o.g b.o.g 20.04.201810:58 ответить ссылка -0.3
Перед тобой шарпы. :/
Да пох. Общая парадигма остается
Пусть будут адреса. По адресам находятся объекты.
Физически - области памяти. Примени соответственно методами доступными в конкретном ЯП.
b.o.g b.o.g 20.04.201813:52 ответить ссылка 0.0
Сериализовать и сравнить строку.
private private 20.04.201809:17 ответить ссылка -0.3
Я не программист, но насколько знаю C# при сравнении типа if ( obj1 == _obj1 && obj2==_obj2 && ... && objN==_objN) , будет сравнивать их последовательно и при первом исключении выдаст false. Это должно быть быстрее, чем сериализация.
Мой вариант ебанут и несерьезен по своей сути. Его могут применять только извращенцы, которым лень писать все if'ы. Так что нет смысла раздувать обсуждение по этой хуйне.
Чем больше ты вникаешь в код, тем больше хочется выйти из команды разработки.
Вот поэтому на галерах рабов всегда приковывают цепями.
Wave Wave 21.04.201820:36 ответить ссылка 0.0
А в этих ваших шарпах == это не ссылочное сравнение?
dfq_ dfq_ 19.04.201822:27 ответить ссылка -0.7
смотря с чем. и есть ли IEqualityComparer у объекта, примитивы норм и так проверяются, а объекты по умолчанию по ссылкам, поэтому нужно компарер задавать, сильно не пинайте. полтора года уже шарпы не трогал.
а вариантов в упрощении 2а, либо через рефлексию перебор параметров по атрибутам, не эффективно но в рот ебать, зато не этот ужас, и добавлять ноывые проверяемые элеметы проще, просто въебать их в класс и усе
либо завести массив типа
static List> conditions = new List>() {
(a, b) => a.FirstName == b.FirstName,
(a, b) => a.LastName == b.LastName
};
lst.All(f => user1, user2);
CriMsoN CriMsoN 19.04.201822:51 ответить ссылка -0.1
блин както херово напиисал
ConsoleAppI - Microsoft Visual Studio	Быстрый запуск (Ctrl+Q)
Файл Правка Вид Проект Сборка Отладка Команда Сервис 1ест Анализ Окно Справка О-	- £] У d* 9	' Debug - Any CPU	-	► Пуск -	^ -	i=] ^Tl 1 ’J И
^ Program.es* •*> X j=j HU ConsoleAppI	” ConsoleAppI.Program
^	1	Busing	System;
2	2	using
На кой эти свистелки с лямбдами, чем обычное

return
a.FirstName == b.FirstName &&
a.LastName == b.LastName &&
...
a.Fetish == b.Fetish;

не устроило?
Cfyz Cfyz 20.04.201801:35 ответить ссылка 1.1
длинная портянка, и если переделать чутка в compare, то можно с помощью линка Any(f(u,u2) 0) и т.п.

да это менее эффективно чем портянка, но я вообще не понимаю зачем использовать шарп если нужна производительность, единственное чем он мне нравится так это гибкость и быстрота разработки, нужна скорость юзай ++
CriMsoN CriMsoN 20.04.201801:51 ответить ссылка -0.3
над писать
var u = obj as User;
return u != null && (u == this || (u.FirstName == this.FirstName && u.LastName == this.Last name ... ... u.Fetish = this.Fetish));

рефлексия медленная и не даст контроля над списком сравниваемых полей. А вообще Equals переопределять не надо, ни к чему хорошему это не приведёт.
рефлексия может применяться шарпами даже там, где ты сам не хотел этого, например равнение 2х структур где есть ссылочные параметры и нет перегрузки для сравнения
я поэтому и написал, что не эффективно, но если используется не часто, то допустимо, особенно если полей дофига, и они будут добавляться, проще пометить атрибутом нужные поля и оставить все на рефлексию, чем лесть и править портянки

твой вариант я и сам использую если код для себя, но это один хер огромная портянка неудобная для чтения
При сравнении двух структур со ссылочными полями значения полей будут сравниваться по ссылке, а не по значению.
гдето читал, что шарп видя в структуре ссылочные поля начинает елозить рефлексией, и думается мне, что если поля с поддержкой компараторов то шарп таки будет через них сравнивать, плохо уже помню
да и к томуже не знаю насколько ты пользовался рефлексией, но с ней можно делать все что душе угодно совместно с атрибутами, хоть в космос запускай
весь WPF это сплошная рефлексия, там плюнуть негде попадешь в рефлексию
можно запилить один хелпер, и иметь во все щели все объекты опятьже руля лишь атрибутами
Рефлексия вполне себе тут работает. Но резон ее использовать зависит от цели, конечно. Для сравнения двух указанных в теме объектов потери скорости незначительны.

Результат:
user1 & user2 are different
user1 & user3 are different
user2 & user4 are equivalent
class Program
{
static void Main(string[] args)
{
User	userl	= new	User ("AAA".,	"BBB",	"CCC",	"ODD",	"EEE",	i);
User	user2	= new	User ("AAA".,	"BBB",	"CCC",	"ODD",	"EEE",	2);
User	user3	= new	User ("AAA".,	"BBB",	"CCC",	"ODD",	"FFF”,	3);
User	user4	= new	User("AAA",	"BBB",	"CCC",	"ODD",
кстати вродекак тут если все параметры примитивы, и делать не класс а структуру, то шарп и так бинарно сравнит
Структуры в стеке хранятся, сравнить два их экземпляра не сложнее чем два инта.
Оператор Equals будет с высокой вероятностью вызываться массово и очень часто (в основном не твоими руками), так что незначительные потери легко станут значительными
Шарпец по умолчанию сравнивает объекты ссылочных типов по ссылкам, а объекты значимых типов -- по значению. А вообще шарп не любит всякие ссылки, указатели... прям как жаба.
Wizuki Wizuki 19.04.201823:01 ответить ссылка 0.0
так оно ж не должно компилироваться ашибка тут:if(!obj is user)
=> if(!(obj is user)
unkuse unkuse 19.04.201822:42 ответить ссылка 0.2
"А еще можно IF'ы распределить по `популярности` и получить на работе премию за оптимизацию" (с) Курсы "Специалист" по C
nivago nivago 19.04.201823:18 ответить ссылка 2.9
И ведь как раз недавно подобное говно делал...
asd072 asd072 20.04.201803:50 ответить ссылка 0.1
пирамида валидации
Напомнило
IX Bulletins
Please choose a bulletin to view:
INTERPOL WANTED! J.C. Denton I READ ME	>	~
Curfew Hours Extended /root/../misdirect::3009
ICARUS FOUND YOU!!!
ICARUS FOUND YOU!!!
ICARUS FOUND YOU!!!
ICARUS FOUND YOU!!! ICARUS FOUND YOU!!! ICARUS FOUND YOU!!! ICARUS FOUND YOU!!! ICARUS FOUND
_zmicer_ _zmicer_ 20.04.201808:30 ответить ссылка 0.0
Мне кажется или все забыли про хеши? Переопределяем _GetHashcode и по ним сравниваем два объекта... профит
ArMeSh ArMeSh 20.04.201810:12 ответить ссылка -0.5
Нельзя переопределять Equals не переопределяя GetHashCode и наоборот, т.к. это ломает работу библиотек C#, в частности LINQ, если с их помощью работать с таким объектом.
Я не говорил, что не надо перегружать Equals
ArMeSh ArMeSh 06.06.201818:35 ответить ссылка 0.0
тогда не ясен смысл вашего коммента. разве что он был саркастическим
Не говоря уже о том, что 1) два одинаковых хэш-кода не означают одинаковости объектов 2) в GetHashcode всё-равно придётся обращаться к каждому из полей
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
г У 1	$
X 1	X
	_ _