|
Hi Pete,
All these problems are already solved by me.
Again. I store Skills as a string in the database.
They are stored like this: Skill 1|Skill 2|Skill 3|Skill 4
of course the data is different but I show you the idea
Then, customers (being developers) asked me if i couldn't provide a class with data stored in Skills as a list
A list Skills has "items"
public class Skill
{
public string Item { get; set; }
}
It doesn't matter if there is data in it, I handle that.
So, I said to my customers I could do what the want but they need to address another Class:
CandidateFunctionWithSkillsList
No problem. But it made me think: what if my customers could make a choise how to recieve the data using the same name for the claas but had the option how it was presented/formatted.
It is just something I would like.
So I went on searching and discovered there were alternatives. But not exactly what I want.
It doesn't exist. So, my question to the C# team is: can you make it happen in a next release.
|
|
|
|
|
Wiep Corbier wrote: I store Skills as a string in the database.
They are stored like this: Skill 1|Skill 2|Skill 3|Skill 4
And that all on it's own is a poor idea. Do you realise how much work it is in SQL to change a skill when you store it like that? First off, it wastes space, secondly it's prone to user error and two skills that are described differently but are actually the same, and thirdly because it's hard to work with for anything more complex than INSERT and DELETE operations.
For example, suppose HR realises a mistake has been made: EmployeeX doesn't have any knowledge in "Skill 2", it's "Skill 5" he knows. Now write the SQL to fix that ... and bear in mind that you might have "Skill 2", and "Skill 21", "Skill 22", "Skill 23", ... so you can't rely on string replace functions or you will cause further errors.
Oh, and while you are at it, fix the spelling mistake that Deirdre always makes in "Skill 17" but no one else does.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I'm a senior. This is not a problem for me. It works 100% perfect.
I have solved this years ago. Trust me.
Anyway, back to the topic please. But you already gave me an answer. Thanks. 
|
|
|
|
|
Then I feel sorry for the company that employs you - that is a rookie mistake, and generally means the rest of the DB design is as full of errors ...
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
Just because "it's worked for years", doesn't mean it was designed properly.
The list of skills NEVER should have been a string holding multiple values like that. It should have been a separate table with foreign keys back to the people that have those skills. The skill is stored ONCE and can be used multiple times. This saves space in the database.
It's not the language that needs to updated to support your poor skills. It's your skills that need to be updated to better support your customers.
|
|
|
|
|
The list of skills NEVER should have been a string holding multiple values like that. It should have been a separate table with foreign keys
That was my original idea too. Very logical. I would do it also, even as a habit
BUT
By exeption I will explain:
Take a skills list with 1000 skills.
Put them in a list. Now find and skill item with the value "Skill 1"
Maybe, this skill is on position 998
Do a find: it will seach at least 998 items in a list before that skill is found
Do a contains on a string and there is one search.
If(Skill.Contains("|Skill 1|"))
than, a Yes or a No. True or False.
If I'm wrong, I will redesign.
|
|
|
|
|
Wiep Corbier wrote: Maybe, this skill is on position 998
Do a find: it will seach at least 998 items in a list before that skill is found Actually, that's what indexes on a database table are for. If you had a Skills table it would not have to do a table scan to find the specific skill you wanted. And it would actually be much much faster than checking all the strings to see if it contains.
You would use foreign keys and it would be magnitudes faster than doing a LIKE statement.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
Thanks, this looks like a good idea.
Don't remember why I dismissed it years ago, because this is the way I do this normally.
I'll get back on it.
|
|
|
|
|
I've thought about it, and it's time to switch to subtables. I started that now.
Thanks for the anwers all participants.
|
|
|
|
|
Want to bet he doesn't redesign?
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
If my skill is "baking breads|cakes" it won't work as you expect it to.
If you frequently will search lists of 1000 skills, you should rather put them in a dictionary (i.e. hash table). That would work even with "baking breads|cakes".
Another side is that if you measure the time to search a 1000 element list, you'd probably be surprised by how fast it is. If the search is initated due to a user interaction, all the other stuff involved will require magnitudes more resources. Worry about the time for searching an in-memory list only if it is done thousands or tens of thousands times for each user interaction.
|
|
|
|
|
The list are not bigger than 80 items.
My solution is already super fast.
That's not the problem.
btw: I'm aware of dictonary.
|
|
|
|
|
Wiep Corbier wrote: My solution is already super fast. So don't worry about the expense of searching an 80 item list. Even though a straight search in a simple string is super fast, it does not imply that other alternatives are unacceptably slow.
|
|
|
|
|
I agree
Everywhere else I use a different approach like list, dictonary etc
I use ms sql server databases. I love creating related tables. It's what I do all the time.
But this time only I took a different path. (
|
|
|
|
|
Dave Kreskowiak wrote: It's not the language that needs to updated to support your poor skills. It's your skills that need to be updated to better support your customers.
Hear hear! :applause:
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Wiep Corbier wrote: All these problems are already solved by me. Errr, no you haven't. You have talked about one narrow point and extrapolated that to having answered my whole question.
I'll put this to you another way. Describe EXACTLY how this mechanism would work. How would it work with vars? How would it run through a CI pipeline? How will it cope with type explosions and types with differing numbers of fields? I want this class to be COM Compatible, how's that going to work? I want to use IoC to inject one of these classes, which one would it pick? In other words, explain how you plan to cope with ALL of the edge cases that would be introduced.
|
|
|
|
|
Wiep Corbier wrote: what if my customers could make a choise how to recieve the data using the same name for the claas but had the option how it was presented/formatted. So why don't you provide that in the one class you've got? dotNet doesn't know how to ask the customer - their language, preferred terminology, CLI or GUI, how your GUI is laid out and how the selection list should be presented. You do. You are the only one who can ask the customer in a proper way, and from the selected alternative initialized the object this way or that way. Or if you insist, create an object of this or that class.
Two accessor methods of a given class may very well reference the same private data, presenting it in different formats (or set functions parsing value in different ways before storing it in the private value). You would have an explicitly declared internal value, not implicitly declared ones, so the simple {get; set;} would be relpaced with e.g. for the list format:
{ get { return skills.Split('|'); }
set { skills = string.Join("|", value); }} In this case, "skills" may actually be the implicitly declared variable from your string based accessor. Your (single) class may have as many different accessors (here: presentation formats) as you like. Of course you may have have initializers as well accepting intial values in either format, but being parsed and stored in one common format.
If you are using this "skills" case as a simple way of illustrating what you think should be a commonly available mechanism for a lot of different purposes, then you should come up with a better illustration of the need.
If your real problem is accessing the list of skills as a list or as a string, then it is handled by two properties (accessors) presenting the skills in two different ways from the one class.
If you insist on two different classes with a single name, they will be different (you asked for it, you got it) - different set of members, different methods, different semantics. In the general case, only the name would be the same. You may construct examples where two different classes happen to have some members with similar names and somewhat similar semantics, while others differ. The overlap is more or less "accidental"; a general mechanism could not require "> x% similarity between same-name classes", it would be general (sic!). We have a general object class - it is called "object". Your proposal is, in the generalized sense, more or less to make an "object2" class: If the class name implies nothing about object members or semantics, it has no syntactic or semantic value. You have no clue about what to expect from an object of that name.
I am fully satisified with the classic "object" class. I don't see a need for an "object2" class.
|
|
|
|
|
I have read you contribution. Thanks for that.
What I want doesn't exist and I'm not interested in alternatives that already exists.
I want something new.
I want the team that creates C# to make that happen.
All of you think I have a dumb idea.
But for me, inheritances is dumb. Interfaces are dumb, and many more
Why? You don't need them. There are other ways to do the same.
But they exist because someone had the idea and others liked it.
The difference is, they understand it. Nobody understands my idea. Doesn't matter, I'm used to it.
ps: I don't want a class with two representation of the skill data. I just do not want that.
(of course it's an idea that crossed my mind)
|
|
|
|
|
Wiep Corbier wrote: ps: I don't want a class with two representation of the skill data. I just do not want that. But I suggest a single reperesentation! Two representations would be really bad design. Two different presentations is a completely different thing.
It is like when your code handles a binary integer, you don't present it like a binary integer but format it into a character string. You may format it as hex, octal, decimal, with or without leading zeroes, trailing currency sign or whatever. For binary reals you print out the number of decimal positions according to need. The internal integer or real binary value is unique and unaffected by the presentation format.
Similar with you skills list. Whether it is stored as a single string with | separators, a list, a dictionary or as a database table doesn't matter: From that unique representation you may format it as a string, as a list or in any other format. For console output, you use different Format or ToString format strings, for binary formats, you use different accessors (that may also use Format/ToString when appropriate).
An accessor isn't a representation. It is an accessor, a way to get at a representation. The representation is independent of it.
|
|
|
|
|
Perhaps I misunderstand something ... but when I read your question I want to ask why you don't create a Property (as a List of String or as List of Class-Object) which could be used in the way you want : either you use only a part of the Property (in case of List of String) or you use a sub-Property (in case of List of Class-Object).
|
|
|
|
|
Wiep Corbier wrote: What I want doesn't exist and I'm not interested in alternatives that already exists.
I want something new.
Good luck with that Sparky... I've been coding for over 40 years, and have NEVER come up with a use case for identical class names (I'd really like to see multiple inheritance come back, though).
Your actual problem is your weak design, not a perceived missing feature in C#.
Fix your code.
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
Wiep Corbier wrote: As you can see, the property with the name Skills is a string.
It can be a long string and it stores one or more Skills. Forget multiple classes with the same name, I'm wondering why in the world you would do this.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
Why? I just explained it several times.
Quote: When answering a question please;
Read the question carefully
|
|
|
|
|
Wiep Corbier wrote: I just explained it several times. Not in your OP.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|