ABA


"איך הייתם פותרים את הבעיה הבאה (בעית real-life שיש לי בעבודה)"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #20085 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 20085
dyermaker 
חבר מתאריך 4.2.03
1644 הודעות
   19:02   26.06.13   
אל הפורום  
  איך הייתם פותרים את הבעיה הבאה (בעית real-life שיש לי בעבודה)  
 
   בעיקרון יש לנו טבלה בוליאנית שמורכבת מלקוחות (עמודות) ופרמטרים (שורות)

נראה משהו כזה:


Customer_1 Customer_2 Customer_3
Parameter 1 0 1 0
Parameter 2 1 0 1
Parameter 3 1 1 1

כמובן שבפועל יש כ10 לקוחות וכ200 פרמטרים..
זאת אומרת שכל פעם שמוסיפים לקוח חדש (והפרמטרים שלו בד"כ מתבססים על פרמטרים של לקוח ישן) צריך להוסיף עמודה חדשה עם כל ה200 פרמטרים..

מעניין אותי לדעת איך אתם הייתם פותרים את זה, גם בגישת Object Orineted וגם לא..

יאללה זרקו


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  חסר פרטים משה הלולן 26.06.13 19:23 1
     אוקיי אז אני אנסה להסביר יותר טוב dyermaker  26.06.13 19:32 2
         עדיין זה מאוד תלוי לפחות לפי הידע שלי במה מדובר. משה הלולן 26.06.13 20:33 3
  לא הייתי ממש את זה ככה.. VeNom  27.06.13 09:23 4
     לא הבנתי מה אתה מתכוון dyermaker  27.06.13 12:38 6
         דוגמא VeNom  28.06.13 12:38 8
  אופס כנראה שממש לא הסברתי את עצמי כמו שצריך, כנסו dyermaker  27.06.13 12:33 5
  אם אני מבין אותך נכון.. ShocKi  27.06.13 14:40 7

       
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק
   19:23   26.06.13   
אל הפורום  
  1. חסר פרטים  
בתגובה להודעה מספר 0
 
   שאלת שאלה כללית.

האם כל הפרמטרים חייבים להיות ממולאים ידנית? אי אפשר לשים להם ערך ברירת מחדל?
אי אפשר להעתיק את כל הפרמטרים מהלקוח האחרון (אמרת שרובם דומים) ורק לשנות מה ששונה?
קיצר צריך פרטים
אי אפשר לענות ככה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dyermaker 
חבר מתאריך 4.2.03
1644 הודעות
   19:32   26.06.13   
אל הפורום  
  2. אוקיי אז אני אנסה להסביר יותר טוב  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 26.06.13 בשעה 19:35 בברכה, dyermaker
 
המטרה של הטבלה היא להגיד האם פרמטר מסויים קיים עבור לקוח מסויים או לא (אם הערך הוא 0 הפרטמר לא קיים עבור הלקוח ואם הערך הוא 1 הפרמטר כן קיים)

בנוסף יש חשיבות לסדר, כלומר עבור לקוח נתון, אם פרמטר X ערכו 1 ואחריו יש סדרה של אפסים ואז פרמטר Y ערכו 1 אז אנחנו בעצם מסיקים שפרמטר Y מגיע בדיוק אחרי פרמטר X.

וכן כיום ככה אנחנו יוצרים לקוח חדש, מוסיפים עמודה חדשה ואז עוברים שורה שורה ובודקים מה הערך של הלקוח עליו הוא מבוסס ולפי זה שמים את הערך.

כמובן שזאת עבודת נמלים של לעבור על 200 שורות וכל פעם לקפוץ לראות מה הערך שצריך להיות.

בכל מקרה בזמן ריצה מעניין אותנו רק -לקוח נתון אחד- ולא חשוב מה יש לאחרים.

השאלה שלי היא האם יש הצעה לפתרון יותר אלגנטי.

יותר ברור?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק
   20:33   26.06.13   
אל הפורום  
  3. עדיין זה מאוד תלוי לפחות לפי הידע שלי במה מדובר.  
בתגובה להודעה מספר 2
 
   חשבתם על לפתוח טבלה חדשה תקרא לה פרמטרים
parameter id
paramert name

ואז יהיה טבלת לקוחות
user id
user name

וטבלת פרמטרים ללקוח
יהיה משהו כזה
user id
paramert id

ככה בעצם במקום לעבור על 200 עמודות תצטרך להכניס רק את הפרמטרים הקיימים ללקוח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   09:23   27.06.13   
אל הפורום  
  4. לא הייתי ממש את זה ככה..  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 27.06.13 בשעה 09:50 בברכה, VeNom
 
מבחינת OOP, הייתי ממש קלאס של לקוח שיש לו את כל הנתונים האלה. כל הנתונים האלה היו מחולקים לתתי מחלקות(אובייקטים) וזהו.
ב DB הייתי בוחר לבנות טבלה של לקוחות, כאשר יש לך ID של לקוח ו XML שהוא בעצם סריאליזציה של כל הנתונים.
בעליית המערכת, הייתי טוען את הלקוח(או את כל הלקוחות) לקלאס(בעזרת DESERIALIZE) ומשתמש באובייקט לאורך כל התוכנית מבלי לגשת כל הזמן ל DB.

משהו כזה:



class Customer
{
Guid Id; // primary key.
CustomerDetails Details;
}

[Serializable]
class CustomerDetails
{
// divide the details the way you want.
// This class will be serialized into a xml(or json) and saved in the db.
}

מה היתרונות של זה:
1. הרחבה..אתה תוכל להתחרב ולהוסיף דברים ספציפים רק ללקוח אחד(תשתמש בnullables עבור כל משתנה).
2. אתה לא תחזיק מלא ערכי NULL עבור כולם במקרה ולקוח אחד רוצה משהו אחד ולכל השאר "אין" אותו.
3. נוחות ותחזוקה.. יותר נוח לתחזק XML שמסודר..
4. עבודה לוגית נכונה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dyermaker 
חבר מתאריך 4.2.03
1644 הודעות
   12:38   27.06.13   
אל הפורום  
  6. לא הבנתי מה אתה מתכוון  
בתגובה להודעה מספר 4
 
   "מבחינת OOP, הייתי ממש קלאס של לקוח שיש לו את כל הנתונים האלה. כל הנתונים האלה היו מחולקים לתתי מחלקות(אובייקטים) וזהו."

מה זה "שיש לו את כל הנתונים האלה." ? זה בדיוק השאלה איך לממש את הנתונים האלה.

והמטרה שיהיה קל לעדכן לקוחות/פרמטרים חדשים וגם שיהיה קל מבחינת התוכנה בזמן ריצה לדעת איזה פרמטר קיים עבור לקוח וגם איזה פרמטר מגיע אחרי איזה פרמטר קודם


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   12:38   28.06.13   
אל הפורום  
  8. דוגמא  
בתגובה להודעה מספר 6
 
   נגיד יש לך Customer:

class Customer
{
Guid Id;
CustomerData Data;
}

[Serializable]
class CustomerData
{
// all the true false props. You can divide them into sub-classes for better organization.

bool? IsMan;
bool? HasDoneBusinessBefore;
bool? IsNice;
}

lets say that the customer is a man and thats all you know about him now.
The DB will look like this:

Customer:
(id):
32462873423432423
(data):
<CustomerData>
<IsMan>true<IsMan>
<HasDoneBusinessBefore/>
<IsNice/>
</CustomerData>

Your code has a Customer that was loaded from the DB.

Customer customer = LoadCustomerFromDbById(32462873423432423);// will deserialize the xml into the data property.

now the customer has done business with you and you realized he isn't nice:

customer.HasDoneBusinessBefore = true;
customer.IsNice = false;

customer.Update(); //will serialize the data and update the db with the new xml. Your DB will look like this:


Customer:
(id):
32462873423432423
(data):
<CustomerData>
<IsMan>true<IsMan>
<HasDoneBusinessBefore>true</HasDoneBusinessBefore>
<IsNice>false</IsNice>
</CustomerData>

Now adding new properties will happen only in the customerdata class(no updating the db here).
Since the properties are "nullables" you can add them without giving default values that you dont want to give.
A good example is with the IsNice property. The customer hasn't done any business with you. That doesn't mean he isn't nice.That means you don't know if he is and you will update it on a future transaction.
Adding a new customer is adding a new row into the customer table.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dyermaker 
חבר מתאריך 4.2.03
1644 הודעות
   12:33   27.06.13   
אל הפורום  
  5. אופס כנראה שממש לא הסברתי את עצמי כמו שצריך, כנסו  
בתגובה להודעה מספר 0
 
   אין שום database ושום כלום.. אין בכלל גישה לSQL או איזה שפת שאילתות אחרת.. התוכנה בכלל כתובה ב-C (אבל עדיין מעניין אותי פתרון בגישת Object Oriented)

כרגע הטבלה מוגדרת כמערך קבוע בגודל customers*parameters והיא מאותחלת ממש כמו שכתבתי בהודעה הראשונה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   14:40   27.06.13   
אל הפורום  
  7. אם אני מבין אותך נכון..  
בתגובה להודעה מספר 0
 
   אתה בעצם שואל איך לקחת את היתרונות ניהול מסד נתונים ואת היתרונות של OOP וליישם אותם ב C טהור?

כאן צריך לשאול 2 שאלות:
1. הטבלה שאתם מחזיקים כרגע זה בעצם מטריצה דינאמית?
2. השאלה שלך היא בגדר שאלה תאורטית או שצריך לקחת בחשבון גם דברים מעשיים כמו, מינימום שינויים בפונקציות שמשתמשות במבנה הנתונים הקודם.

מה שאני לא הבנתי בסיפור הוא, מהם הפרטים החשובים לך?
אתה לא יכול לקבל גם זמן ריצה מינימלי וגם סיבוכיות מקום קטנה.. אתה צריך להגדיר מה חשוב לך יותר...

אם אתם באמת עובדים עם מערכת כזאת, אתם לבטח שומרים בצורה כלשהי את הנתונים על דיסק.. אם אין לכם מסד נתונים, אתם עושים זאת בעזרת קבצים? איך הנתונים מופיעים בקובץ? זה קובץ אחד שמכיל את הכל, או קובץ לכל לקוח?
בהתאם לזה יהיה קל יותר להציע מסד נתונים שיאותחל מהקבצים בזמן מינימלי.


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net