Түрі іске қосылған кезде белгілі болған кезде, нысандарыма db мәндерін қалай салыстыру керек?

Менің дерекқорым келесі кестеге ие:

conditionID, conditionType, conditionValue

ConditionType is an enumeration with values like Integer, String, DateTime, etc.

ConditionValue жол ретінде сақталады.

Енді осы жолды ClassValue-ге салыстыруды жүзеге асыра аламын, сондықтан EqualTo, GreaterThan, LessThan және т.б.

Қазіргі кезде менің дизайным дұрыс емес, себебі менде әдістер бар ( otherValue - бұл салыстыратын мәнім):

GreaterThan(string value, string otherValue);
GreaterThan(int value, int otherValue);
GreaterThan(DateTime value, DateTime otherValue);

Осы ақпаратты инкапсуляциялайтын ConditionValue класын жасай аламын ба деп едім:

GreaterThan(IConditionValue condition, IConditionValue otherValue)
1
қосылды автор Ash Burlaczenko, көзі
Сіз менің бірінші жазбамдағы сілтемелерді қарауыңыз керек. Деректер түрінің ерекше функционалдығын инкапсулау - бұл AOM немесе Нысан түрі үлгісі сияқты жеңілдетілген вариация.
қосылды автор Jeffrey, көзі

5 жауаптар

Бұл адаптивтік объектінің үлгісі немесе Нысандар үлгісін қолдану арқылы оңай модельдеуге болады. Дегенмен, жағдайыңыз үшін өлтірілу мүмкін.

http://adaptiveobjectmodel.com/

http://www.cs.ox.ac.uk/jeremy .gibbons/dpa/typeobject.pdf

Ол моделі сіздің жұмыс уақытында қайта конфигурациялауға, мінез-құлықты қосу/жоюға, ережелерді анықтауға мүмкіндік береді.

2
қосылды
қызықты оқиды.
қосылды автор codecompleting, көзі

Сіз айтып өткен барлық түрлерді IComparable енгізіңіз, сондықтан сіз жай ғана типі IComparable болады және CompareTo() әдісін қолданыңыз.

bool GreaterThan(IComparable value, IComparable otherValue)
{
    return value.CompareTo(otherValue) > 0;
}
1
қосылды

Бұл өте бірегей мысал.

public class ConditionValue
{
    private object value;
    private IValueType valueType;

    public ConditionValue(object value, IValueType valueType)
    {
        this.value = value;
        this.valueType = valueType;
    }

    public bool GreaterThan(ConditionValue cv)
    {
        return valueType.GreaterThan(this.value, cv.value);
    }
}

public interface IValueType
{
    bool GreaterThan(object left, object right);
}

public class IntegerType : IValueType
{
    public bool GreaterThan(object left, object right)
    {
        return (int)left > (int)right;
    }
}
1
қосылды
Жақсы, бұл мен үшін неғұрлым анық, мен оны тексеруге болады, оның коллекциясын integer.GreaterThan әдісі және т.б ..
қосылды автор codecompleting, көзі
және бұл зауыт int, string немесе List қайтарады? hmmm.. сенімдімін, бірақ оны кешіріңіздер.
қосылды автор codecompleting, көзі
Дерекқорда сақталатын «archetypes» деректер түрін анықтау үшін IValueType интерфейсін қолдануға болады. ConditionType енін қабылдаған және әдісімен ConditionValue данасын қайтаратын зауыттық әдіс бар және осы enum мәні үшін IValueType өңдегішті пайдаланыңыз.
қосылды автор Jeffrey, көзі
    public enum ValueType
    {
        String = 0,
        Integer = 1,
        CustomDataType = 3
    }

    public interface IValueType : IComparer
    {
        string ToString(object obj);
    }

    public class IntegerValueType : IValueType
    {
        public int Compare(object left, object right)
        {
            return ((int)left).CompareTo((int)right);
        }

        public string ToString(object obj)
        {
            return ((int)obj).ToString();
        }
    }

    public class StringValueType : IValueType
    {
        public int Compare(object left, object right)
        {
            return ((string)left).CompareTo((string)right);
        }

        public string ToString(object obj)
        {
            return ((string)obj).ToString();
        }
    }

    public class Value : IComparable { private object value; private IValueType valueType; public Value(object value, IValueType valueType) { this.value = value; this.valueType = valueType; } public static implicit operator Value(string value) { return ValueFactory.Create(value, ValueType.String); } public int CompareTo(Value obj) { return this.valueType.Compare(this.value, obj.value); } public static bool operator <(Value left, Value right) { return left.CompareTo(right) == -1; } public static bool operator >(Value left, Value right) { return left.CompareTo(right) == 1; } public static bool operator ==(Value left, Value right) { return left.CompareTo(right) == 0; } public static bool operator !=(Value left, Value right) { return left.CompareTo(right) != 0; } public override string ToString() { return this.valueType.ToString(this.value); } } public class ValueFactory { private static IDictionary _valueTypes = new Dictionary(); static ValueFactory() { _valueTypes.Add(ValueType.String, new StringValueType()); _valueTypes.Add(ValueType.Integer, new IntegerValueType()); } public static Value Create(object value, object valueType) { // //This logic could be extended to find a ValueType that supports //one of the types in the objects inheritance tree. This would //also require creating an ObjectValueType, which would be a last //resort in the case of the object type not being supported. // if (!_valueTypes.ContainsKey(valueType)) throw new ArgumentException("valueType is not supported"); return new Value(value, _valueTypes[valueType]); } } class Program { static void Main(string[] args) { int x = 32; int y = 16; Value cx = ValueFactory.Create(x, ValueType.Integer); Value cy = ValueFactory.Create(y, ValueType.Integer); Console.WriteLine("cx = "+cx); Console.WriteLine("cy = "+cy); Console.WriteLine("x< cy); Console.WriteLine("x>y = {0}", cx > cy); Console.WriteLine("x==y = {0}", cx == cy); Console.WriteLine("x!=y = {0}", cx != cy); Value name = ValueFactory.Create("Jeffrey Schultz", ValueType.String); Console.WriteLine("{0} == You = {1}", name, name == "You"); Console.ReadLine(); } } 
1
қосылды
public interface IValueComparer
{
    bool GreaterThan(string source, string destination);
    bool LessThan(string source, string destination);
}

public class IntToIntComparer : IValueComparer
{
    public bool GreaterThan(string source, string detination)
    {
       //better use TryParse and handle exception
        return Int32.Parse(source) > Int32.Parse(detination);
    }

    public bool LessThan(string source, string detination)
    {
       //better use TryParse and handle exception
        return Int32.Parse(source) < Int32.Parse(detination);
    }
}

public class DateToDateComparer : IValueComparer
{
    public bool GreaterThan(string source, string detination)
    {
       //better use TryParse and handle exception
        return DateTime.Parse(source) > DateTime.Parse(detination);
    }

    public bool LessThan(string source, string detination)
    {
       //better use TryParse and handle exception
        return DateTime.Parse(source) < DateTime.Parse(detination);
    }
}

public class StringToStringComparer : IValueComparer
{
    public bool GreaterThan(string source, string detination)
    {
        return source.Length > detination.Length;
    }

    public bool LessThan(string source, string detination)
    {
        return source.Length < detination.Length;
    }
}


public class Condition
{
    public int ID { get; set; }
    public string Value { get; set; }
    public string Type { get; set; }
    public IValueComparer Comparer{get; set;}

    public static string Integer { get { return "Integer"; } }
    public static string String { get { return "String"; } }
    public static string DateTime { get { return "DateTime"; } }

    public static Condition CreateForType(string type)
    {
        if (type == Integer)
            return new Condition { Type = type, Comparer = new IntToIntComparer() };
        if (type == String)
            return new Condition { Type = type, Comparer = new StringToStringComparer() };
        if (type == DateTime)
            return new Condition { Type = type, Comparer = new DateToDateComparer() };
        return null;
    }

    public bool GreaterThan(Condition destination)
    {
        return Comparer.GreaterThan(Value, destination.Value);
    }

    public static bool operator >(Condition source, Condition destination)
    {
        return source.GreaterThan(destination);
    }

    public static bool operator <(Condition source, Condition destination)
    {
        return source.LessThan(destination);
    }

    public bool LessThan(Condition destination)
    {
        return Comparer.LessThan(Value, destination.Value);
    }
}

        var condition1 = Condition.CreateForType("Integer");
        condition1.ID = 1;
        condition1.Value = "5";

        var condition2 = Condition.CreateForType("Integer");
        condition2.ID = 2;
        condition2.Value = "10";

        bool result1 = condition1 > condition2;
        bool result2 = condition1.LessThan(condition2);
0
қосылды
Бірақ деректерді дерекқордан іске қосу кезінде аламын, бұл қалай жұмыс істейтініне сенімді емеспін бе?
қосылды автор codecompleting, көзі
@MohamedAbed Сұрақтың ішіндегі дерекқор бағанымның мысалын келтірдім, сондықтан сол бағандарға арналған мәндермен жолдарды қайтарамын.
қосылды автор codecompleting, көзі
IntegerType сияқты conditionType арқылы анықталған деректер түрін көрсететін сыныпты жасауыңыз қажет. IntegerType бүтін мәндерді салыстыруды біледі. Сондай-ақ, мәнді және деректер түрін өңдегішті қабылдайтын шарт талап етіледі.
қосылды автор Jeffrey, көзі
Бұл сандарды салыстыруға қалай мүмкіндік береді? «Сіздің кодты» мұнда қалай жазасыз? Мен «if (source> destination)» деп жазсаңыз, ол компиляция жасамайды.
қосылды автор Jeffrey, көзі
Деректер базасынан деректерді қалай алуға болады, мысал келтіріңіз
қосылды автор Mohamed Abed, көзі
Үлгі шешіммен жаңартылған жауап
қосылды автор Mohamed Abed, көзі