"计算机科学只有两个难题:缓存失效和命名事物."
菲尔卡尔顿
是否存在使缓存无效的通用解决方案或方法; 要知道某个条目何时过时,所以您可以保证始终获得最新数据?
例如,考虑一个getData()从文件中获取数据的函数.它根据文件的最后修改时间对其进行缓存,每次调用时都会检查该文件.
然后添加第二个函数transformData()来转换数据,并在下次调用函数时缓存其结果.它不知道该文件 - 如何添加依赖关系,如果文件被更改,此缓存将变为无效?
您可以在getData()每次调用时transformData()调用它并将其与用于构建缓存的值进行比较,但这可能最终成本非常高.
我知道抽象是关于采取更具体的东西并使其更抽象.这可能是数据结构或过程.例如:
map是对过程的抽象,该过程对值列表执行一组操作以产生全新的值列表.它集中在这样一个事实,即程序遍历列表中的每个项目以生成新列表并忽略对列表中每个项目执行的实际操作.所以我的问题是:抽象与泛化有什么不同?我正在寻找主要与函数式编程相关的答案.但是,如果在面向对象编程中有相似之处,那么我也想了解它们.
oop abstraction functional-programming nomenclature generalization
这可能是一个简单/基本的OOP问题,但我仍然无法弄清楚如何解决它.我在访谈中遇到了以下问题:制作一个UML类图并编写一个"智能"手机的基本代码,其中包含电话和MP3播放器的功能.我们有以下(接受)解决方案:
class Telephone
{
public string name { get; set; }
public Telephone()
{
name = "name telephone";
}
}
class MP3
{
public string name { get; set; }
public MP3()
{
name = "name mp3";
}
}
Run Code Online (Sandbox Code Playgroud)
而"智能"手机类:
class TelephoneMP3
{
public Telephone tel;
public MP3 mp3;
public TelephoneMP3()
{
tel = new Telephone();
mp3 = new MP3();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我们在TelephoneMP3和Telephone/MP3类之间有一个组合关系.
但是,使用此代码,TelephoneMP3不是电话,而且TelephoneMP3也不是MP3,这是不合逻辑的.那么,为了使这个有效,我应该做些什么改变?例如,这种测试:
if (telMp3 is Telephone)
{
Console.WriteLine("TelephoneMP3 is telephone");
}
if (telMp3 is MP3)
{
Console.WriteLine("TelephoneMP3 is …Run Code Online (Sandbox Code Playgroud) 我有一个对象,它有几个数组作为字段.它的类大致如下所示:
public class Helper {
InsuranceInvoices[] insuranceInvoices;
InsuranceCollectiveInvoices[] insuranceCollectiveInvoices
BankInvoices[] bankInvoices;
BankCollectiveInvoices[] bankCollectiveInvoices;
}
Run Code Online (Sandbox Code Playgroud)
所有发票类型都有一个共同标记界面发票.
我需要获取所有发票才能调用其他方法.
Helper helperObject = new Helper();
// ...
for (InsuranceInvoices invoice : helperObject.getInsuranceInvoices()) {
Integer customerId = invoice.getCustomerId();
// ...
}
for (BankInvoices invoice : helperObject.getBankInvoices()) {
Integer customerId = invoice.getCustomerId();
// ...
}
// repeat with all array fields
Run Code Online (Sandbox Code Playgroud)
问题是所有发票只有标记接口.方法getCustomerID()不是由相互接口或类定义的.这是一种由于给定的规范而无法改变的行为.
for-each-loops中的代码重复是让我烦恼的事情.我必须对四个不同阵列中的所有发票对象执行完全相同的操作.因此,四个for-each-loops不必要地膨胀代码.
有没有办法可以编写一般(私有)方法?一个想法是:
private void generalMethod(Invoice[] invoiceArray){
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这需要四个instanceof检查,因为类Invoice不知道方法getCusomterId().因此,我什么也得不到; 该方法仍然包含重复.
我很感谢每一个可能的解决方案来概括这个问题!
我正在使用 Go 开发一个 Web API,有很多冗余的数据库查询扫描代码。
func (m *ContractModel) WorkQuestions(cid int) ([]models.WorkQuestion, error) {
results, err := m.DB.Query(queries.WORK_QUESTIONS, cid)
if err != nil {
return nil, err
}
var workQuestions []models.WorkQuestion
for results.Next() {
var wq models.WorkQuestion
err = results.Scan(&wq.ContractStateID, &wq.QuestionID, &wq.Question, &wq.ID, &wq.Answer, &wq.Compulsory)
if err != nil {
return nil, err
}
workQuestions = append(workQuestions, wq)
}
return workQuestions, nil
}
func (m *ContractModel) Questions(cid int) ([]models.Question, error) {
results, err := m.DB.Query(queries.QUESTIONS, cid)
if err != nil { …Run Code Online (Sandbox Code Playgroud) 我对UML很新,所以我对泛化和实现有一些疑问.我正在模拟电子微控制器的行为,我需要从UML描述生成C++代码.
据我所知,一个类 实现了一个接口,这意味着它可以提供一个接口的实现.甲一般化关系可以两个类之间存在.在这种情况下,派生类继承基类的所有成员,并获得对公共成员和受保护成员的访问权限.
这是我的问题(我使用Visual Paradigm作为建模工具).我们假设我们有一个微控制器的模块,即Timer.我们有一组我们可以执行,说的操作initTimer(),startTimer(),stopTimer()等等.实际上这些函数定义了一种API.我们可能有不同类别的Timer,比方说TimerA,TimerB,TimerC继承(或实施?)所有的引用操作.这张照片可能会使情景更加清晰.[C]表示分类器.
+----------------------------------+
| <<SW>> |
| <<Singleton>> |
+--------------| TimerA |
| +----------------------------------+
| | -instance : TimerA* = null [C] |
| | -instanceFlag : bool = false [C] |
| | -moduleAddress const = 0x0010 |
| +----------------------------------+
| | -TimerA() |
V | +getInstance() : TimerA* [C] |
+---------------+ +----------------------------------+
| …Run Code Online (Sandbox Code Playgroud) oop ×2
abstraction ×1
algorithm ×1
c# ×1
caching ×1
class ×1
composition ×1
go ×1
java ×1
nomenclature ×1
refactoring ×1
reflection ×1
sql ×1
uml ×1