LINUX.ORG.RU
Ответ на: комментарий от chkalov

Шаблонный код - это что такое?

Видимо, что-то такое

a=1;
peremennaya1=a+1;
peremennaya2=a+2;
peremennaya3=a+3;
peremennaya4=a+4;

методы устранения

Пуля, в лоб индуса.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Тогда T4.

Либо рефлексия.

Направде полезная штука, к примеру какой-нить автомаппер вполне себе устраняет такой «шаблонный» код.

chkalov
()

Все зависит от того, что тебе нужно. Для InotifyPropertyChanged добавили [callermembername]. Не супер, конечно, но трохе получше стало.

chkalov
()
Ответ на: комментарий от chkalov

Тогда T4. Либо рефлексия.

В приведённом мной примере достаточно использовать цикл с массивом, т.е. просто-напросто нужно вынуть руки из жопы и прочитать хотя бы одну мурзилку по программированию.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

примеси, абстрактные методы, DI/IoC

anonymous
()

Не знаю, как в C#, а в Java используется type erasure.

anonymous
()
Ответ на: комментарий от soslow

Ну офигеть

Офигеть можно от вопроса ТСа - как пишут программы вообще и на C# в частности. Ну вот что тут можно ответить? Только послать... читать GOF.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Ненене, вопрос хороший.

GoF тут ни при чем.

Я имею в виду, например, частый случай с INotigyPropertyChanged, многие сейчас руками это пишут, задалбывает неимоверно. Интересно же, какие есть способы это решить, etc. И это именно вопрос к языку, т.к. в джаве есть свои средства, аннотейшн процессинг какой-нибудь, в c# его нет, но есть что-то другое.

chkalov
()
Ответ на: комментарий от chkalov

частый случай с INotigyPropertyChanged

Решается тривиально созданием шаблона Property с методами set/get/listen/unlisten и последующим созданием вместо собственно свойств экземпляров Property от нужного типа.

Если для того, чтобы избавиться от повторяющегося кода, вам нужны новые синтаксические конструкции в языке - у вас большие проблемы. И не с языком, а с вами.

no-dashi ★★★★★
()

минимум это внесение ясности, простоты, понятности, так что примеры шаблонных кодов в студию

anonymous
()
Ответ на: комментарий от no-dashi

Глупости говоришь, мне не нужны новые конструкции. Достаточно тех, что есть.

chkalov
()
Ответ на: комментарий от no-dashi

на примере nemerle http://igor.quatrocode.com/2007/04/nemerle.html

Итак, мы имеем 6 однотипных полей, которые мы должны добавлять в каждый создаваемый класс. Это и есть та самая рутина,

...

В этом классе не хватает публичных свойств к заданным полям. Это еще одна из рутинных операций, которые подлежат автоматизации"

в общем я так понял мне нужно что то из метапрограммирования: например кодогенерация. В C# возможны следующие возможности: (см. полную таблицу тут)

  • Изучение кода и метаданных при помощи рефлексии
  • Text Template Transformation Toolkit (T4)
  • Создание кода при помощи CodeDOM
  • Создание кода при помощи Reflection.Emit
  • Создание кода при помощи выражений
  • Создание кода при помощи переписывания IL
  • Dynamic Language Runtime (DLR)
  • Языки программирования и инструменты
  • Управление .NET компилятором с помощью Project Roslyn
mag1ck
() автор топика
Ответ на: комментарий от chkalov
// CPropertyListener.java
public interface CPropertyListener<T,W> {
	public void propertyChanged(W owner, T oldVal, T newVal);
}
// CProperty.java
import java.util.*;

class CProperty<T,W> {

    private W owner;
    private T value;
    private Vector<CPropertyListener<T,W>> listeners;

    public CProperty(W owner) {
	this.owner = owner;
	listeners = new Vector<CPropertyListener<T,W>>();
    }

    public CProperty(W owner, T t) {
	this.owner = owner;
	listeners = new Vector<CPropertyListener<T,W>>();
	value = t;
    }

    public void set(T t) {
	T old = value;
	value = t;
	for (int i=0;i<listeners.size();i++) {
	    listeners.elementAt(i).propertyChanged(owner,old,value);
	}
    }

    public T get() { return value; }

    public void listen(CPropertyListener<T,W> l) { if (!listeners.contains(l)) listeners.add(l); }
    public void unlisten(CPropertyListener<T,W> l) { if (listeners.contains(l)) listeners.remove(l); }

}
// Account.java
class Account {

	private CProperty<String,Account> name;
	private CProperty<String,Account> password;
	private CProperty<Integer,Account> age;

	public Account() {
		name = new CProperty<String,Account>(this);
		password = new CProperty<String,Account>(this);
		age = new CProperty<Integer,Account>(this);
	}

	public CProperty<String,Account> name() { return name; }
	public CProperty<String,Account> password() { return password; }

	public static void main(String args[]) {
		Account root = new Account();
		root.name.set("root");
		root.password.set("zhopa");
		root.age.set(21);
		CPropertyListener<String,Account> renameTracker = new CPropertyListener<String,Account>() {
			public void propertyChanged(Account acc, String oName, String newName) {
				System.err.println(oName + " renamed to " + newName);
			}
		};
		CPropertyListener<String,Account> chpassTracker = new CPropertyListener<String,Account>() {
			public void propertyChanged(Account acc, String oPass, String newPass) {
				System.err.println(acc.name.get() + " change pass from " + oPass + " to " + newPass);
			}
		};
		CPropertyListener<Integer,Account> chAgeTracker = new CPropertyListener<Integer,Account>() {
			public void propertyChanged(Account acc, Integer o, Integer n) {
				System.err.println(acc.name.get() + " change age from " + o + " to " + n);
			}
		};
		root.name.listen(renameTracker);
		root.password.listen(chpassTracker);
		root.age.listen(chAgeTracker);
		root.name.set("odmin");
		root.password.set("paroll");
		root.age.set(13);
	}
}
$ java Account 
root renamed to odmin
odmin change pass from zhopa to paroll
odmin change age from 21 to 13

Ну примерно так. Избавляемся от шаблонной реализации листенеров в жабе. Аналогично в принципе многие другие однообразия устраняются.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

Я ему про Фому, он мне про Ерёму.

У меня есть такая вьюха

<TextBlock Text=«{Binding Name}» />

Мам проперти

class MyDataContext{ public string Name{ get; set; } }

Хочу так писать, при этом, что бы при изменении Name вьюха знала бы это. Биндить можно только проперти. Куда ты предлагаешь свои странные классы тутай присобачить?

Сейчас приходится вместо автопроперти раскрывать это все, и руками триггерить ивент. Ну, или использовать какое-нибудь стороннее решение. Собстно, я знаю как, но это, на мой взгляд, не очевидно.

chkalov
()

Какие методы устранения шаблонного кода существуют вообще и в C# в частности?

Например метод «Непрогуливание, а слушание и понимание лекций».

И «непрогуливание» не имеет никакого отношения к гулям.

korvin_ ★★★★★
()
Ответ на: комментарий от chkalov

Сейчас приходится вместо автопроперти раскрывать это все

«Руками раскрывать» это вместо

public string zhopa { get; set; }
писать
private string _zhopa;
event _ezhopa;
public string Zhopa { get { return _zhopa; } set { _zhopa = value; _ezhopa(this); } }
??? Ужоснах!!! на целую строку больше надо писать!!!

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

Это и есть шаблонный, повторяющийся код.

Ты, видимо, ничего и не писал никогда.

Когда у тебя много свойств, код вырастает вдруг в два раза. И это реально напрягает, когда вместо авто проперти нужно писать ненужную фигню.

chkalov
()
Ответ на: комментарий от no-dashi

Под такую аргументацию(всего на строчку больше писать) можно все что угодно подвести, что ж сейчас нормальные люди на фортране не пишут?

chkalov
()

Какие методы устранения шаблонного кода существуют вообще

Common Lisp

PS Racket не знаю - советовать не могу

ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от chkalov

У меня для тебя плохие новости - мне тут пацаны на раёне сказали, что однострочные ацессоры давно не считаются кодом и перешли практически в разряд деклараций, а количество приватных атрибутов никого не волнует, поскольку они приватные.

no-dashi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.